From 474c18c29f48aa1ffd238b4a68ac996db06bcc84 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Mon, 3 Mar 2025 16:32:02 +0000 Subject: [PATCH 01/37] maybe all objects need to be false --- .../Framework/DummySendServerObjectManager.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs b/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs index 0ae163c4..fcc89a53 100644 --- a/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs +++ b/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs @@ -22,10 +22,8 @@ public class DummySendServerObjectManager(ConcurrentDictionary s public Task> HasObjects( IReadOnlyCollection objectIds, CancellationToken cancellationToken - ) - { - return Task.FromResult(objectIds.Distinct().ToDictionary(x => x, savedObjects.ContainsKey)); - } + ) => + Task.FromResult(objectIds.Distinct().ToDictionary(x => x, _=> false)); public Task UploadObjects( IReadOnlyList objects, From 9dd04c0881c2b1c7c85f8e49473c20f1583f573a Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Mon, 3 Mar 2025 16:39:17 +0000 Subject: [PATCH 02/37] fmt --- .../Framework/DummySendServerObjectManager.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs b/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs index fcc89a53..ca46a915 100644 --- a/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs +++ b/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs @@ -22,8 +22,7 @@ public class DummySendServerObjectManager(ConcurrentDictionary s public Task> HasObjects( IReadOnlyCollection objectIds, CancellationToken cancellationToken - ) => - Task.FromResult(objectIds.Distinct().ToDictionary(x => x, _=> false)); + ) => Task.FromResult(objectIds.Distinct().ToDictionary(x => x, _ => false)); public Task UploadObjects( IReadOnlyList objects, From 53b66dd26ba3e33d939f7f7f56c606a2a97d18f6 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 4 Mar 2025 13:29:36 +0000 Subject: [PATCH 03/37] remove extra code form hosts --- src/Speckle.Sdk/Host/Attributes.cs | 54 +------ src/Speckle.Sdk/Host/HostApplications.cs | 175 ----------------------- 2 files changed, 3 insertions(+), 226 deletions(-) diff --git a/src/Speckle.Sdk/Host/Attributes.cs b/src/Speckle.Sdk/Host/Attributes.cs index 5887f6af..b30e6989 100644 --- a/src/Speckle.Sdk/Host/Attributes.cs +++ b/src/Speckle.Sdk/Host/Attributes.cs @@ -1,63 +1,15 @@ namespace Speckle.Sdk.Host; -[AttributeUsage(AttributeTargets.Constructor)] -public sealed class SchemaInfoAttribute : Attribute -{ - public SchemaInfoAttribute(string name, string description) - : this(name, description, null, null) { } - - public SchemaInfoAttribute(string name, string description, string? category, string? subcategory) - { - Name = name; - Description = description; - Category = category; - Subcategory = subcategory; - } - - public string? Subcategory { get; } - - public string? Category { get; } - - public string Description { get; } - - public string Name { get; } -} - -[AttributeUsage(AttributeTargets.Constructor)] -public sealed class SchemaDeprecatedAttribute : Attribute { } - -[AttributeUsage(AttributeTargets.Parameter)] -public sealed class SchemaParamInfoAttribute : Attribute -{ - public SchemaParamInfoAttribute(string description) - { - Description = description; - } - - public string Description { get; } -} - -/// -/// Used to indicate which is the main input parameter of the schema builder component. Schema info will be attached to this object. -/// -[AttributeUsage(AttributeTargets.Parameter)] -public sealed class SchemaMainParamAttribute : Attribute { } - // TODO: this could be nuked, as it's only used to hide props on Base, // which we might want to expose anyways... /// /// Used to ignore properties from expand objects etc /// [AttributeUsage(AttributeTargets.Property)] -public sealed class SchemaIgnoreAttribute : Attribute { } +public sealed class SchemaIgnoreAttribute : Attribute; [AttributeUsage(AttributeTargets.Method)] -public sealed class SchemaComputedAttribute : Attribute +public sealed class SchemaComputedAttribute(string name) : Attribute { - public SchemaComputedAttribute(string name) - { - Name = name; - } - - public string Name { get; } + public string Name { get; } = name; } diff --git a/src/Speckle.Sdk/Host/HostApplications.cs b/src/Speckle.Sdk/Host/HostApplications.cs index fc38d763..19a4aee1 100644 --- a/src/Speckle.Sdk/Host/HostApplications.cs +++ b/src/Speckle.Sdk/Host/HostApplications.cs @@ -42,179 +42,4 @@ public static class HostApplications Navisworks = new("Navisworks", "navisworks"), AdvanceSteel = new("Advance Steel", "advancesteel"), Other = new("Other", "other"); - - /// - /// Gets a HostApplication form a string. It could be the versioned name or a string coming from a process running. - /// - /// String with the name of the app - /// - [Pure] - public static HostApplication GetHostAppFromString(string? appname) - { - if (appname == null) - { - return Other; - } - - appname = appname.ToLowerInvariant().Replace(" ", ""); - if (appname.Contains("dynamo")) - { - return Dynamo; - } - - if (appname.Contains("revit")) - { - return Revit; - } - - if (appname.Contains("autocad")) - { - return AutoCAD; - } - if (appname.Contains("civil3d")) - { - return Civil3D; - } - if (appname.Contains("civil")) - { - return Civil; - } - - if (appname.Contains("rhino")) - { - return Rhino; - } - - if (appname.Contains("grasshopper")) - { - return Grasshopper; - } - - if (appname.Contains("unity")) - { - return Unity; - } - - if (appname.Contains("gsa")) - { - return GSA; - } - - if (appname.Contains("microstation")) - { - return MicroStation; - } - - if (appname.Contains("openroads")) - { - return OpenRoads; - } - - if (appname.Contains("openrail")) - { - return OpenRail; - } - - if (appname.Contains("openbuildings")) - { - return OpenBuildings; - } - - if (appname.Contains("etabs")) - { - return ETABS; - } - - if (appname.Contains("sap")) - { - return SAP2000; - } - - if (appname.Contains("csibridge")) - { - return CSiBridge; - } - - if (appname.Contains("safe")) - { - return SAFE; - } - - if (appname.Contains("teklastructures")) - { - return TeklaStructures; - } - - if (appname.Contains("dxf")) - { - return Dxf; - } - - if (appname.Contains("excel")) - { - return Excel; - } - - if (appname.Contains("unreal")) - { - return Unreal; - } - - if (appname.Contains("powerbi")) - { - return PowerBI; - } - - if (appname.Contains("blender")) - { - return Blender; - } - - if (appname.Contains("qgis")) - { - return QGIS; - } - - if (appname.Contains("arcgis")) - { - return ArcGIS; - } - - if (appname.Contains("sketchup")) - { - return SketchUp; - } - - if (appname.Contains("archicad")) - { - return Archicad; - } - - if (appname.Contains("topsolid")) - { - return TopSolid; - } - - if (appname.Contains("python")) - { - return Python; - } - - if (appname.Contains("net")) - { - return NET; - } - - if (appname.Contains("navisworks")) - { - return Navisworks; - } - - if (appname.Contains("advancesteel")) - { - return AdvanceSteel; - } - - return new HostApplication(appname, appname); - } } From 378a91995e7280850901ffaabca32c54864b4f3f Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 4 Mar 2025 16:41:59 +0000 Subject: [PATCH 04/37] fix build --- src/Speckle.Sdk/Host/HostApplications.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Speckle.Sdk/Host/HostApplications.cs b/src/Speckle.Sdk/Host/HostApplications.cs index 19a4aee1..2abced0a 100644 --- a/src/Speckle.Sdk/Host/HostApplications.cs +++ b/src/Speckle.Sdk/Host/HostApplications.cs @@ -1,5 +1,3 @@ -using System.Diagnostics.Contracts; - namespace Speckle.Sdk.Host; /// From 4d552b68348b27b7f04dc95f8132a6eb824304df Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 4 Mar 2025 16:44:15 +0000 Subject: [PATCH 05/37] add speckle serializer exception test --- .../ExceptionTests.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs index a9315b8a..ff22c2b8 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Logging.Abstractions; using Speckle.Objects.Geometry; using Speckle.Sdk.Host; using Speckle.Sdk.Models; +using Speckle.Sdk.Serialisation; using Speckle.Sdk.Serialisation.V2.Receive; using Speckle.Sdk.Serialisation.V2.Send; using Speckle.Sdk.Serialization.Tests.Framework; @@ -144,4 +145,23 @@ public class ExceptionTests } await Verify(ex).UseParameters(hasObject); } + + [SpeckleType("Objects.Geometry.BadBase")] + public class BadBase : Base + { +#pragma warning disable CA1065 + public string BadProp => throw new NotImplementedException(); +#pragma warning restore CA1065 + } + + [Fact] + public void Test_SpeckleSerializerException() + { + var factory = new ObjectSerializerFactory(new BasePropertyGatherer()); + var serializer = factory.Create(new Dictionary(), default); + Assert.Throws(() => + { + var _ = serializer.Serialize(new BadBase()).ToList(); + }); + } } From 7cad14fe250df0b9d1eee173040d8b259ff86d25 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 5 Mar 2025 09:34:44 +0000 Subject: [PATCH 06/37] add DownloadObjects and DownloadSingleObject test --- Directory.Packages.props | 3 +- .../SerializationResultTests.cs | 24 +++++ ...ManagerTests.DownloadObjects.verified.json | 10 ++ ...erTests.DownloadSingleObject.verified.json | 4 + .../ServerObjectManagerTests.cs | 94 +++++++++++++++++++ .../Speckle.Sdk.Serialization.Tests.csproj | 4 +- .../packages.lock.json | 28 ++++++ 7 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadObjects.verified.json create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadSingleObject.verified.json create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 3f6002d6..ec64d197 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -21,6 +21,7 @@ + @@ -35,4 +36,4 @@ - + \ No newline at end of file diff --git a/tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs b/tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs new file mode 100644 index 00000000..0a55fad5 --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs @@ -0,0 +1,24 @@ +using FluentAssertions; +using Speckle.Sdk.Serialisation; + +namespace Speckle.Sdk.Serialization.Tests; + +public class SerializationTypeTests +{ + [Fact] + public void Json() + { + var json = new Json("{}"); + json.ToString().Should().Be("{}"); + } + + [Fact] + public void Id() + { + var id = new Id("id"); + id.ToString().Should().Be("id"); + id.Equals(new Id("id")).Should().BeTrue(); + id.Equals(new Id("id2")).Should().BeFalse(); + id.GetHashCode().Should().Be("id".GetHashCode()); + } +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadObjects.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadObjects.verified.json new file mode 100644 index 00000000..488ea578 --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadObjects.verified.json @@ -0,0 +1,10 @@ +{ + "6f422a35-6183-48b9-8021-d22ec97e8674": { + "id": "6f422a35-6183-48b9-8021-d22ec97e8674", + "value": true + }, + "ef2f7ea0-495a-46af-a9ad-f18a8a298597": { + "id": "ef2f7ea0-495a-46af-a9ad-f18a8a298597", + "value": true + } +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadSingleObject.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadSingleObject.verified.json new file mode 100644 index 00000000..d9bb684e --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadSingleObject.verified.json @@ -0,0 +1,4 @@ +{ + "id": "6f422a35-6183-48b9-8021-d22ec97e8674", + "value": true +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs new file mode 100644 index 00000000..df5a3eb1 --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs @@ -0,0 +1,94 @@ +using System.Diagnostics.CodeAnalysis; +using Moq; +using RichardSzalay.MockHttp; +using Speckle.Newtonsoft.Json; +using Speckle.Newtonsoft.Json.Linq; +using Speckle.Sdk.Helpers; +using Speckle.Sdk.Logging; +using Speckle.Sdk.Serialisation.V2; + +namespace Speckle.Sdk.Serialization.Tests; + +[ExcludeFromCodeCoverage] +public abstract class MoqTest : IDisposable +{ + protected MoqTest() => Repository = new(MockBehavior.Strict); + + public void Dispose() => Repository.VerifyAll(); + + protected MockRepository Repository { get; private set; } = new(MockBehavior.Strict); + + protected Mock Create(MockBehavior behavior = MockBehavior.Strict) + where T : class => Repository.Create(behavior); +} +public class ServerObjectManagerTests : MoqTest +{ + [Fact] + public async Task DownloadObjects() + { + var id = Guid.Parse("6f422a35-6183-48b9-8021-d22ec97e8674").ToString(); + var id2 = Guid.Parse("ef2f7ea0-495a-46af-a9ad-f18a8a298597").ToString(); + var ct = new CancellationToken(); + var token = "token"; + var timeout = 2; + var uri = new Uri("http://localhost"); + var streamId = "streamId"; + var jObject = new JObject(); + jObject.Add("id", id); + jObject.Add("value", true); + var jObject2 = new JObject(); + jObject2.Add("id", id2); + jObject2.Add("value", true); + var mockHttp = new MockHttpMessageHandler(); + Dictionary postParameters = + new() { { "objects", JsonConvert.SerializeObject(new List { id, id2 }) } }; + + string serializedPayload = JsonConvert.SerializeObject(postParameters); + mockHttp.When(HttpMethod.Post, $"http://localhost/api/getobjects/{streamId}") + .WithContent(serializedPayload).Respond("application/json", + $"{id}\t{jObject.ToString(Formatting.None)}\n{id2}\t{jObject2.ToString(Formatting.None)}\n"); + var httpClient = mockHttp.ToHttpClient(); + var http = Create(); + http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); + + var activityFactory = Create(); + activityFactory.Setup(x => x.Start(null, "DownloadObjects")).Returns((ISdkActivity?)null); + + var serverObjectManager = new ServerObjectManager(http.Object, activityFactory.Object,uri, streamId, token, timeout); + var results = serverObjectManager.DownloadObjects(new List {id, id2}, null, ct); + var objects = new JObject(); + await foreach (var (x, json) in results) + { + objects.Add(x, JToken.Parse(json)); + } + + await VerifyJson(objects.ToString(Formatting.Indented)); + } + + [Fact] + public async Task DownloadSingleObject() + { + var id = Guid.Parse("6f422a35-6183-48b9-8021-d22ec97e8674").ToString(); + var ct = new CancellationToken(); + var token = "token"; + var timeout = 2; + var uri = new Uri("http://localhost"); + var streamId = "streamId"; + var jObject = new JObject(); + jObject.Add("id", id); + jObject.Add("value", true); + var mockHttp = new MockHttpMessageHandler(); + mockHttp.When(HttpMethod.Get, $"http://localhost/objects/{streamId}/{id}/single").Respond("application/json", + $"{jObject.ToString(Formatting.None)}\n"); + var httpClient = mockHttp.ToHttpClient(); + var http = Create(); + http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); + + var activityFactory = Create(); + activityFactory.Setup(x => x.Start(null, "DownloadSingleObject")).Returns((ISdkActivity?)null); + + var serverObjectManager = new ServerObjectManager(http.Object, activityFactory.Object,uri, streamId, token, timeout); + var json = await serverObjectManager.DownloadSingleObject(id, null, ct); + await VerifyJson(json); + } +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj b/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj index 47352da9..4b0874a1 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj +++ b/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -10,6 +10,8 @@ + + diff --git a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json index d2993f2e..f8afa5c6 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json +++ b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json @@ -40,12 +40,27 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, + "Moq": { + "type": "Direct", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, "PolySharp": { "type": "Direct", "requested": "[1.15.0, )", "resolved": "1.15.0", "contentHash": "FbU0El+EEjdpuIX4iDbeS7ki1uzpJPx8vbqOzEtqnl1GZeAGJfq+jCbxeJL2y0EPnUNk8dRnnqR2xnYXg9Tf+g==" }, + "RichardSzalay.MockHttp": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "QwnauYiaywp65QKFnP+wvgiQ2D8Pv888qB2dyfd7MSVDF06sIvxqASenk+RxsWybyyt+Hu1Y251wQxpHTv3UYg==" + }, "Speckle.InterfaceGenerator": { "type": "Direct", "requested": "[0.9.6, )", @@ -69,6 +84,14 @@ "resolved": "0.26.0", "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, "DiffEngine": { "type": "Transitive", "resolved": "15.9.0", @@ -256,6 +279,11 @@ "resolved": "4.5.0", "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, "System.IO.Hashing": { "type": "Transitive", "resolved": "9.0.1", From b24dc685fa3f113782c15604604304a39d67e549 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 5 Mar 2025 09:44:32 +0000 Subject: [PATCH 07/37] fmt --- .../SerializationResultTests.cs | 2 +- .../ServerObjectManagerTests.cs | 56 +++++++++++++------ 2 files changed, 40 insertions(+), 18 deletions(-) diff --git a/tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs b/tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs index 0a55fad5..dc053eeb 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs @@ -11,7 +11,7 @@ public class SerializationTypeTests var json = new Json("{}"); json.ToString().Should().Be("{}"); } - + [Fact] public void Id() { diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs index df5a3eb1..642e01f7 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs @@ -12,7 +12,7 @@ namespace Speckle.Sdk.Serialization.Tests; [ExcludeFromCodeCoverage] public abstract class MoqTest : IDisposable { - protected MoqTest() => Repository = new(MockBehavior.Strict); + protected MoqTest() => Repository = new(MockBehavior.Strict); public void Dispose() => Repository.VerifyAll(); @@ -21,6 +21,7 @@ public abstract class MoqTest : IDisposable protected Mock Create(MockBehavior behavior = MockBehavior.Strict) where T : class => Repository.Create(behavior); } + public class ServerObjectManagerTests : MoqTest { [Fact] @@ -40,22 +41,35 @@ public class ServerObjectManagerTests : MoqTest jObject2.Add("id", id2); jObject2.Add("value", true); var mockHttp = new MockHttpMessageHandler(); - Dictionary postParameters = - new() { { "objects", JsonConvert.SerializeObject(new List { id, id2 }) } }; - + Dictionary postParameters = new() + { + { "objects", JsonConvert.SerializeObject(new List { id, id2 }) }, + }; + string serializedPayload = JsonConvert.SerializeObject(postParameters); - mockHttp.When(HttpMethod.Post, $"http://localhost/api/getobjects/{streamId}") - .WithContent(serializedPayload).Respond("application/json", - $"{id}\t{jObject.ToString(Formatting.None)}\n{id2}\t{jObject2.ToString(Formatting.None)}\n"); + mockHttp + .When(HttpMethod.Post, $"http://localhost/api/getobjects/{streamId}") + .WithContent(serializedPayload) + .Respond( + "application/json", + $"{id}\t{jObject.ToString(Formatting.None)}\n{id2}\t{jObject2.ToString(Formatting.None)}\n" + ); var httpClient = mockHttp.ToHttpClient(); var http = Create(); http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); - + var activityFactory = Create(); activityFactory.Setup(x => x.Start(null, "DownloadObjects")).Returns((ISdkActivity?)null); - - var serverObjectManager = new ServerObjectManager(http.Object, activityFactory.Object,uri, streamId, token, timeout); - var results = serverObjectManager.DownloadObjects(new List {id, id2}, null, ct); + + var serverObjectManager = new ServerObjectManager( + http.Object, + activityFactory.Object, + uri, + streamId, + token, + timeout + ); + var results = serverObjectManager.DownloadObjects(new List { id, id2 }, null, ct); var objects = new JObject(); await foreach (var (x, json) in results) { @@ -64,7 +78,7 @@ public class ServerObjectManagerTests : MoqTest await VerifyJson(objects.ToString(Formatting.Indented)); } - + [Fact] public async Task DownloadSingleObject() { @@ -78,16 +92,24 @@ public class ServerObjectManagerTests : MoqTest jObject.Add("id", id); jObject.Add("value", true); var mockHttp = new MockHttpMessageHandler(); - mockHttp.When(HttpMethod.Get, $"http://localhost/objects/{streamId}/{id}/single").Respond("application/json", - $"{jObject.ToString(Formatting.None)}\n"); + mockHttp + .When(HttpMethod.Get, $"http://localhost/objects/{streamId}/{id}/single") + .Respond("application/json", $"{jObject.ToString(Formatting.None)}\n"); var httpClient = mockHttp.ToHttpClient(); var http = Create(); http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); - + var activityFactory = Create(); activityFactory.Setup(x => x.Start(null, "DownloadSingleObject")).Returns((ISdkActivity?)null); - - var serverObjectManager = new ServerObjectManager(http.Object, activityFactory.Object,uri, streamId, token, timeout); + + var serverObjectManager = new ServerObjectManager( + http.Object, + activityFactory.Object, + uri, + streamId, + token, + timeout + ); var json = await serverObjectManager.DownloadSingleObject(id, null, ct); await VerifyJson(json); } From ea08b83f7a4531a9149dad547f935b5f9b8c17fc Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 5 Mar 2025 09:54:31 +0000 Subject: [PATCH 08/37] add HasObjects test --- .../Serialisation/V2/ServerObjectManager.cs | 4 +- ...bjectManagerTests.HasObjects.verified.json | 4 ++ .../ServerObjectManagerTests.cs | 56 ++++++++++++++++--- 3 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.HasObjects.verified.json diff --git a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs index 895a4a6f..76c2158d 100644 --- a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs +++ b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs @@ -139,10 +139,8 @@ public class ServerObjectManager : IServerObjectManager CancellationToken cancellationToken ) { + using var _ = _activityFactory.Start(); cancellationToken.ThrowIfCancellationRequested(); - - // Stopwatch sw = new Stopwatch(); sw.Start(); - string objectsPostParameter = JsonConvert.SerializeObject(objectIds); var payload = new Dictionary { { "objects", objectsPostParameter } }; string serializedPayload = JsonConvert.SerializeObject(payload); diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.HasObjects.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.HasObjects.verified.json new file mode 100644 index 00000000..4295906d --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.HasObjects.verified.json @@ -0,0 +1,4 @@ +{ + "6f422a35-6183-48b9-8021-d22ec97e8674": true, + "ef2f7ea0-495a-46af-a9ad-f18a8a298597": false +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs index 642e01f7..d2e8a14f 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs @@ -34,12 +34,8 @@ public class ServerObjectManagerTests : MoqTest var timeout = 2; var uri = new Uri("http://localhost"); var streamId = "streamId"; - var jObject = new JObject(); - jObject.Add("id", id); - jObject.Add("value", true); - var jObject2 = new JObject(); - jObject2.Add("id", id2); - jObject2.Add("value", true); + var jObject = new JObject { { "id", id }, { "value", true } }; + var jObject2 = new JObject { { "id", id2 }, { "value", true } }; var mockHttp = new MockHttpMessageHandler(); Dictionary postParameters = new() { @@ -88,9 +84,7 @@ public class ServerObjectManagerTests : MoqTest var timeout = 2; var uri = new Uri("http://localhost"); var streamId = "streamId"; - var jObject = new JObject(); - jObject.Add("id", id); - jObject.Add("value", true); + var jObject = new JObject { { "id", id }, { "value", true } }; var mockHttp = new MockHttpMessageHandler(); mockHttp .When(HttpMethod.Get, $"http://localhost/objects/{streamId}/{id}/single") @@ -113,4 +107,48 @@ public class ServerObjectManagerTests : MoqTest var json = await serverObjectManager.DownloadSingleObject(id, null, ct); await VerifyJson(json); } + + [Fact] + public async Task HasObjects() + { + var id = Guid.Parse("6f422a35-6183-48b9-8021-d22ec97e8674").ToString(); + var id2 = Guid.Parse("ef2f7ea0-495a-46af-a9ad-f18a8a298597").ToString(); + var ct = new CancellationToken(); + var token = "token"; + var timeout = 2; + var uri = new Uri("http://localhost"); + var streamId = "streamId"; + var jObject = new JObject { { "id", id }, { "value", true } }; + var jObject2 = new JObject { { "id", id2 }, { "value", true } }; + var mockHttp = new MockHttpMessageHandler(); + Dictionary postParameters = new() + { + { "objects", JsonConvert.SerializeObject(new List { id, id2 }) }, + }; + + Dictionary responseParameters = new() { { id, true }, { id2, false } }; + string serializedPayload = JsonConvert.SerializeObject(postParameters); + mockHttp + .When(HttpMethod.Post, $"http://localhost/api/diff/{streamId}") + .WithContent(serializedPayload) + .Respond("application/json", JsonConvert.SerializeObject(responseParameters)); + var httpClient = mockHttp.ToHttpClient(); + var http = Create(); + http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); + + var activityFactory = Create(); + activityFactory.Setup(x => x.Start(null, "HasObjects")).Returns((ISdkActivity?)null); + + var serverObjectManager = new ServerObjectManager( + http.Object, + activityFactory.Object, + uri, + streamId, + token, + timeout + ); + var results = await serverObjectManager.HasObjects(new List { id, id2 }, ct); + + await Verify(results); + } } From 4959f277e84d1def15234f2d406389e6f01cf202 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 5 Mar 2025 11:10:21 +0000 Subject: [PATCH 09/37] BaseItem tests --- .../Serialisation/V2/Send/BaseItem.cs | 5 +- .../Serialisation/V2/Send/EmptyDictionary.cs | 47 ------------------- ...sultTests.cs => SerializationTypeTests.cs} | 12 +++++ 3 files changed, 14 insertions(+), 50 deletions(-) delete mode 100644 src/Speckle.Sdk/Serialisation/V2/Send/EmptyDictionary.cs rename tests/Speckle.Sdk.Serialization.Tests/{SerializationResultTests.cs => SerializationTypeTests.cs} (51%) diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs b/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs index f5c39f4b..2a88e3db 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs @@ -2,8 +2,7 @@ using System.Text; namespace Speckle.Sdk.Serialisation.V2.Send; -public readonly record struct BaseItem(Id Id, Json Json, bool NeedsStorage, Dictionary? Closures) - : IHasByteSize +public sealed record BaseItem(Id Id, Json Json, bool NeedsStorage, Dictionary? Closures) : IHasByteSize { public int ByteSize { get; } = Encoding.UTF8.GetByteCount(Json.Value); @@ -13,7 +12,7 @@ public readonly record struct BaseItem(Id Id, Json Json, bool NeedsStorage, Dict { return false; } - return string.Equals(Id.Value, other.Value.Id.Value, StringComparison.OrdinalIgnoreCase); + return string.Equals(Id.Value, other.Id.Value, StringComparison.OrdinalIgnoreCase); } public override int GetHashCode() => Id.GetHashCode(); diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/EmptyDictionary.cs b/src/Speckle.Sdk/Serialisation/V2/Send/EmptyDictionary.cs deleted file mode 100644 index 7059231a..00000000 --- a/src/Speckle.Sdk/Serialisation/V2/Send/EmptyDictionary.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Collections; -using System.Diagnostics.CodeAnalysis; - -namespace Speckle.Sdk.Serialisation.V2.Send; - -public class EmptyDictionary : IDictionary -{ - public IEnumerator> GetEnumerator() => throw new NotImplementedException(); - - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - - public void Add(KeyValuePair item) { } - - public void Clear() => throw new NotImplementedException(); - - public bool Contains(KeyValuePair item) => false; - - public void CopyTo(KeyValuePair[] array, int arrayIndex) => throw new NotImplementedException(); - - public bool Remove(KeyValuePair item) => false; - - public int Count => 0; - public bool IsReadOnly => false; - - public void Add(TKey key, TValue value) { } - - public bool ContainsKey(TKey key) => false; - - public bool Remove(TKey key) => false; - - public bool TryGetValue(TKey key, [UnscopedRef] out TValue value) - { - value = default!; - return false; - } - - public TValue this[TKey key] - { -#pragma warning disable CA1065 - get => throw new NotImplementedException(); -#pragma warning restore CA1065 - set { } - } - - public ICollection Keys { get; } - public ICollection Values { get; } -} diff --git a/tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs b/tests/Speckle.Sdk.Serialization.Tests/SerializationTypeTests.cs similarity index 51% rename from tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs rename to tests/Speckle.Sdk.Serialization.Tests/SerializationTypeTests.cs index dc053eeb..432e5103 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/SerializationResultTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/SerializationTypeTests.cs @@ -1,5 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Serialisation; +using Speckle.Sdk.Serialisation.V2.Send; namespace Speckle.Sdk.Serialization.Tests; @@ -21,4 +22,15 @@ public class SerializationTypeTests id.Equals(new Id("id2")).Should().BeFalse(); id.GetHashCode().Should().Be("id".GetHashCode()); } + + [Fact] + public void BaseItem() + { + var id = new Id("id"); + var json = new Json("{}"); + var baseItem = new BaseItem(id, json, false, new Dictionary()); + baseItem.Equals(new BaseItem(id, json, false, new Dictionary())).Should().BeTrue(); + baseItem.Equals(new BaseItem(new Id("id2"), json, false, new Dictionary())).Should().BeFalse(); + baseItem.GetHashCode().Should().Be(id.GetHashCode()); + } } From 9f36c9cfe555d9476a6bff23e61c39899647e728 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 5 Mar 2025 12:18:19 +0000 Subject: [PATCH 10/37] adjust code and add test for UploadObjects --- .../Serialisation/V2/ServerObjectManager.cs | 15 +++- .../V2/ServerObjectManagerFactory.cs | 11 ++- ...ploadObjects_compressed=False.verified.txt | 12 +++ ...UploadObjects_compressed=True.verified.txt | Bin 0 -> 394 bytes .../ServerObjectManagerTests.cs | 75 ++++++++++++++++-- .../DummyReceiveServerObjectManager.cs | 4 +- 6 files changed, 105 insertions(+), 12 deletions(-) create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=False.verified.txt create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=True.verified.txt diff --git a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs index 76c2158d..1c29e910 100644 --- a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs +++ b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs @@ -13,6 +13,12 @@ using Speckle.Sdk.Transports.ServerUtils; namespace Speckle.Sdk.Serialisation.V2; +public class ServerObjectManagerOptions(TimeSpan? timeout = null, string? boundary = null) +{ + public TimeSpan Timeout => timeout ?? TimeSpan.FromSeconds(120); + public string Boundary => boundary ?? Guid.NewGuid().ToString(); +} + [GenerateAutoInterface] public class ServerObjectManager : IServerObjectManager { @@ -21,6 +27,7 @@ public class ServerObjectManager : IServerObjectManager private readonly ISdkActivityFactory _activityFactory; private readonly HttpClient _client; private readonly string _streamId; + private readonly ServerObjectManagerOptions _serverObjectManagerOptions; public ServerObjectManager( ISpeckleHttp speckleHttp, @@ -28,13 +35,14 @@ public class ServerObjectManager : IServerObjectManager Uri baseUri, string streamId, string? authorizationToken, - int timeoutSeconds = 120 + ServerObjectManagerOptions? options = null ) { + _serverObjectManagerOptions = options ?? new(); _activityFactory = activityFactory; _client = speckleHttp.CreateHttpClient( new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip }, - timeoutSeconds: timeoutSeconds, + timeoutSeconds: (int)_serverObjectManagerOptions.Timeout.TotalSeconds, authorizationToken: authorizationToken ); _client.BaseAddress = baseUri; @@ -167,6 +175,7 @@ public class ServerObjectManager : IServerObjectManager CancellationToken cancellationToken ) { + using var _ = _activityFactory.Start(); cancellationToken.ThrowIfCancellationRequested(); using HttpRequestMessage message = new() @@ -175,7 +184,7 @@ public class ServerObjectManager : IServerObjectManager Method = HttpMethod.Post, }; - MultipartFormDataContent multipart = new(); + MultipartFormDataContent multipart = new(_serverObjectManagerOptions.Boundary); int mpId = 0; var ctBuilder = new StringBuilder("["); diff --git a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManagerFactory.cs b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManagerFactory.cs index 071a62b5..0fba82bf 100644 --- a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManagerFactory.cs +++ b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManagerFactory.cs @@ -8,6 +8,13 @@ namespace Speckle.Sdk.Serialisation.V2; public class ServerObjectManagerFactory(ISpeckleHttp speckleHttp, ISdkActivityFactory activityFactory) : IServerObjectManagerFactory { - public IServerObjectManager Create(Uri url, string streamId, string? authorizationToken, int timeoutSeconds = 120) => - new ServerObjectManager(speckleHttp, activityFactory, url, streamId, authorizationToken, timeoutSeconds); + public IServerObjectManager Create(Uri url, string streamId, string? authorizationToken, TimeSpan? timeout = null) => + new ServerObjectManager( + speckleHttp, + activityFactory, + url, + streamId, + authorizationToken, + new ServerObjectManagerOptions(timeout: timeout) + ); } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=False.verified.txt b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=False.verified.txt new file mode 100644 index 00000000..a6a11599 --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=False.verified.txt @@ -0,0 +1,12 @@ +--boundary +Content-Type: text/plain; charset=utf-8 +Content-Disposition: form-data; name=batch-0; filename=batch-0; filename*=utf-8''batch-0 + +[{ + "id": "6f422a35-6183-48b9-8021-d22ec97e8674", + "value": true +},{ + "id": "ef2f7ea0-495a-46af-a9ad-f18a8a298597", + "value": true +}] +--boundary-- diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=True.verified.txt b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=True.verified.txt new file mode 100644 index 0000000000000000000000000000000000000000..b9d825664499db945a317e61cd8856bde840c186 GIT binary patch literal 394 zcmaFAd%v!3QhsS(N@7tZmveqzNorn+Zb)T8s+B@wK|xMta$-qlex81MRb~NP+BGjZ zKP59S-AVyP*d?>LAip>hq~1y)Ex#yNHzlzo(OMxdF*nsVDX}CuL)XAsAuTf}6}yO* zZD~oGu7$cfR4o^m{QLcTIT*lzD+kCnhRNPsk305K4S z$3tic8Hda { id, id2 }, null, ct); var objects = new JObject(); @@ -102,7 +106,7 @@ public class ServerObjectManagerTests : MoqTest uri, streamId, token, - timeout + new(timeout: TimeSpan.FromSeconds(timeout)) ); var json = await serverObjectManager.DownloadSingleObject(id, null, ct); await VerifyJson(json); @@ -118,8 +122,6 @@ public class ServerObjectManagerTests : MoqTest var timeout = 2; var uri = new Uri("http://localhost"); var streamId = "streamId"; - var jObject = new JObject { { "id", id }, { "value", true } }; - var jObject2 = new JObject { { "id", id2 }, { "value", true } }; var mockHttp = new MockHttpMessageHandler(); Dictionary postParameters = new() { @@ -145,10 +147,73 @@ public class ServerObjectManagerTests : MoqTest uri, streamId, token, - timeout + new(timeout: TimeSpan.FromSeconds(timeout)) ); var results = await serverObjectManager.HasObjects(new List { id, id2 }, ct); await Verify(results); } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task UploadObjects(bool compressed) + { + var id = Guid.Parse("6f422a35-6183-48b9-8021-d22ec97e8674").ToString(); + var id2 = Guid.Parse("ef2f7ea0-495a-46af-a9ad-f18a8a298597").ToString(); + var ct = new CancellationToken(); + var token = "token"; + var timeout = 2; + var uri = new Uri("http://localhost"); + var streamId = "streamId"; + var jObject = new JObject { { "id", id }, { "value", true } }; + var jObject2 = new JObject { { "id", id2 }, { "value", true } }; + + var mockHttp = new MockHttpMessageHandler(); + mockHttp + .When(HttpMethod.Post, $"http://localhost/objects/{streamId}") + .Respond(x => HandleUploadRequest(x, compressed)); + var httpClient = mockHttp.ToHttpClient(); + var http = Create(); + http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); + + var activityFactory = Create(); + activityFactory.Setup(x => x.Start(null, "UploadObjects")).Returns((ISdkActivity?)null); + + var serverObjectManager = new ServerObjectManager( + http.Object, + activityFactory.Object, + uri, + streamId, + token, + new(timeout: TimeSpan.FromSeconds(timeout), boundary: "boundary") + ); + await serverObjectManager.UploadObjects( + new List + { + new(new(id), new Json(jObject.ToString()), true, null), + new(new(id2), new Json(jObject2.ToString()), true, null), + }, + compressed, + null, + ct + ); + } + + private async Task HandleUploadRequest(HttpRequestMessage req, bool compressed) + { + var content = await req.Content.NotNull().ReadAsStringAsync().ConfigureAwait(false); + try + { + await Verify(content).UseParameters(compressed); + } +#pragma warning disable CA1031 + catch +#pragma warning restore CA1031 + { + return new HttpResponseMessage(HttpStatusCode.BadRequest); + } + + return new HttpResponseMessage(HttpStatusCode.OK); + } } diff --git a/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs b/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs index 75787dc7..e038f33c 100644 --- a/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs +++ b/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs @@ -37,14 +37,14 @@ public class DummyReceiveServerObjectManager(IReadOnlyDictionary ) => throw new NotImplementedException(); public Task UploadObjects( - IReadOnlyList objects, + IReadOnlyList objectsToUpload, bool compressPayloads, IProgress? progress, CancellationToken cancellationToken ) { long totalBytes = 0; - foreach (var item in objects) + foreach (var item in objectsToUpload) { totalBytes += Encoding.Default.GetByteCount(item.Json.Value); } From a96e0f8c8ec575eb44d7ee08fb9f2910841dd132 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 5 Mar 2025 12:38:34 +0000 Subject: [PATCH 11/37] Remove try/catch --- .../ServerObjectManagerTests.cs | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs index 4d100a8b..471dec2d 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs @@ -203,17 +203,7 @@ public class ServerObjectManagerTests : MoqTest private async Task HandleUploadRequest(HttpRequestMessage req, bool compressed) { var content = await req.Content.NotNull().ReadAsStringAsync().ConfigureAwait(false); - try - { - await Verify(content).UseParameters(compressed); - } -#pragma warning disable CA1031 - catch -#pragma warning restore CA1031 - { - return new HttpResponseMessage(HttpStatusCode.BadRequest); - } - + await Verify(content).UseParameters(compressed); return new HttpResponseMessage(HttpStatusCode.OK); } } From 26f1802787072b877440fb1a20fa847a63a3b89f Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 5 Mar 2025 14:13:05 +0000 Subject: [PATCH 12/37] can't test compressed? use lib to parse multipart --- Directory.Packages.props | 1 + .../ServerObjectManagerTests.cs | 26 ++++++++++++++++--- .../Speckle.Sdk.Serialization.Tests.csproj | 1 + .../packages.lock.json | 21 +++++++++++++++ 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index ec64d197..a9f44a4e 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,6 +6,7 @@ + diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs index 471dec2d..d31c6441 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs @@ -1,5 +1,8 @@ using System.Diagnostics.CodeAnalysis; using System.Net; +using System.Text; +using FluentAssertions; +using HttpMultipartParser; using Moq; using RichardSzalay.MockHttp; using Speckle.Newtonsoft.Json; @@ -172,7 +175,7 @@ public class ServerObjectManagerTests : MoqTest var mockHttp = new MockHttpMessageHandler(); mockHttp .When(HttpMethod.Post, $"http://localhost/objects/{streamId}") - .Respond(x => HandleUploadRequest(x, compressed)); + .Respond(x => HandleUploadRequest(x, compressed, new List { jObject, jObject2 })); var httpClient = mockHttp.ToHttpClient(); var http = Create(); http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); @@ -200,10 +203,27 @@ public class ServerObjectManagerTests : MoqTest ); } - private async Task HandleUploadRequest(HttpRequestMessage req, bool compressed) + private async Task HandleUploadRequest( + HttpRequestMessage req, + bool compressed, + List objects + ) { var content = await req.Content.NotNull().ReadAsStringAsync().ConfigureAwait(false); - await Verify(content).UseParameters(compressed); + var stream = new MemoryStream(Encoding.Default.GetBytes(content)); + var formData = await MultipartFormDataParser.ParseAsync(stream, "boundary"); + formData.Files.Count.Should().Be(1); + var file = formData.Files[0]; + file.FileName.Should().Be("batch-0"); + // file.ContentType.Should().Be("application/json"); + if (!compressed) + { + var dataStream = file.Data; + using var reader = new StreamReader(dataStream); + var s = await reader.ReadToEndAsync(); + JsonConvert.DeserializeObject>(s).Should().BeEquivalentTo(objects); + } + return new HttpResponseMessage(HttpStatusCode.OK); } } diff --git a/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj b/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj index 4b0874a1..3f3689e8 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj +++ b/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj @@ -9,6 +9,7 @@ + diff --git a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json index f8afa5c6..3e40f9b6 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json +++ b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json @@ -20,6 +20,17 @@ "resolved": "5.12.0", "contentHash": "dJuigXycpJNOiLT9or7mkHSkGFHgGW3/p6cNNYEKZBa7Hhp1FdX/cvqYWWYhRLpfoZOedeA7aRbYiOB3vW/dvA==" }, + "HttpMultipartParser": { + "type": "Direct", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "WeGKDK62waagwo9nokRY62DrLukwVCNXOPVjrzi/qSS73D+B6zPOBkImsFqzhvRNweIobR74js9M2HTV+PTeIg==", + "dependencies": { + "Microsoft.CSharp": "4.7.0", + "Microsoft.IO.RecyclableMemoryStream": "3.0.1", + "System.Buffers": "4.6.0" + } + }, "Microsoft.NET.Test.Sdk": { "type": "Direct", "requested": "[17.13.0, )", @@ -198,6 +209,11 @@ "System.Runtime.CompilerServices.Unsafe": "4.5.1" } }, + "Microsoft.IO.RecyclableMemoryStream": { + "type": "Transitive", + "resolved": "3.0.1", + "contentHash": "s/s20YTVY9r9TPfTrN5g8zPF1YhwxyqO6PxUkrYTGI2B+OGPe9AdajWZrLhFqXIvqIW23fnUE4+ztrUWNU1+9g==" + }, "Microsoft.SourceLink.Common": { "type": "Transitive", "resolved": "8.0.0", @@ -269,6 +285,11 @@ "SQLitePCLRaw.core": "2.1.4" } }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" + }, "System.CodeDom": { "type": "Transitive", "resolved": "9.0.1", From c784fbf462011df6a4f3182ce7a733843a688298 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 5 Mar 2025 14:14:42 +0000 Subject: [PATCH 13/37] remove unused verify snapshots --- ...ts.UploadObjects_compressed=False.verified.txt | 12 ------------ ...sts.UploadObjects_compressed=True.verified.txt | Bin 394 -> 0 bytes 2 files changed, 12 deletions(-) delete mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=False.verified.txt delete mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=True.verified.txt diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=False.verified.txt b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=False.verified.txt deleted file mode 100644 index a6a11599..00000000 --- a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=False.verified.txt +++ /dev/null @@ -1,12 +0,0 @@ ---boundary -Content-Type: text/plain; charset=utf-8 -Content-Disposition: form-data; name=batch-0; filename=batch-0; filename*=utf-8''batch-0 - -[{ - "id": "6f422a35-6183-48b9-8021-d22ec97e8674", - "value": true -},{ - "id": "ef2f7ea0-495a-46af-a9ad-f18a8a298597", - "value": true -}] ---boundary-- diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=True.verified.txt b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.UploadObjects_compressed=True.verified.txt deleted file mode 100644 index b9d825664499db945a317e61cd8856bde840c186..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 394 zcmaFAd%v!3QhsS(N@7tZmveqzNorn+Zb)T8s+B@wK|xMta$-qlex81MRb~NP+BGjZ zKP59S-AVyP*d?>LAip>hq~1y)Ex#yNHzlzo(OMxdF*nsVDX}CuL)XAsAuTf}6}yO* zZD~oGu7$cfR4o^m{QLcTIT*lzD+kCnhRNPsk305K4S z$3tic8Hda Date: Thu, 6 Mar 2025 11:59:13 +0000 Subject: [PATCH 14/37] Remove more unused attributes --- src/Speckle.Objects/Geometry/Brep.cs | 16 +++++++------- src/Speckle.Sdk/Host/Attributes.cs | 15 ------------- src/Speckle.Sdk/Models/Base.cs | 9 +------- src/Speckle.Sdk/Models/DynamicBase.cs | 21 +------------------ .../Models/DynamicBaseMemberType.cs | 13 +++--------- 5 files changed, 13 insertions(+), 61 deletions(-) delete mode 100644 src/Speckle.Sdk/Host/Attributes.cs diff --git a/src/Speckle.Objects/Geometry/Brep.cs b/src/Speckle.Objects/Geometry/Brep.cs index df201c32..c02ea6d6 100644 --- a/src/Speckle.Objects/Geometry/Brep.cs +++ b/src/Speckle.Objects/Geometry/Brep.cs @@ -31,7 +31,7 @@ public class Brep : Base, IHasArea, IHasVolume, IHasBoundingBox, ITransformable< /// /// Gets or sets the flat list of numbers representing the 's surfaces. /// - [DetachProperty, SchemaIgnore, Chunkable(31250)] + [DetachProperty, Chunkable(31250)] public List SurfacesValue { get @@ -77,7 +77,7 @@ public class Brep : Base, IHasArea, IHasVolume, IHasBoundingBox, ITransformable< /// /// This is only used for the class serialisation/deserialisation. You should use instead. /// - [DetachProperty, SchemaIgnore, Chunkable(31250)] + [DetachProperty, Chunkable(31250)] public List Curve3DValues { get => CurveArrayEncodingExtensions.ToArray(Curve3D); @@ -102,7 +102,7 @@ public class Brep : Base, IHasArea, IHasVolume, IHasBoundingBox, ITransformable< /// /// This is only used for the class serialisation/deserialisation. You should use instead. /// - [DetachProperty, SchemaIgnore, Chunkable(31250)] + [DetachProperty, Chunkable(31250)] public List Curve2DValues { get => CurveArrayEncodingExtensions.ToArray(Curve2D); @@ -127,7 +127,7 @@ public class Brep : Base, IHasArea, IHasVolume, IHasBoundingBox, ITransformable< /// /// This is only used for the class serialisation/deserialisation. You should use instead. /// - [DetachProperty, SchemaIgnore, Chunkable(31250)] + [DetachProperty, Chunkable(31250)] public List VerticesValue { get @@ -167,7 +167,7 @@ public class Brep : Base, IHasArea, IHasVolume, IHasBoundingBox, ITransformable< /// /// This is only used for the class serialisation/deserialisation. You should use instead. /// - [DetachProperty, SchemaIgnore, Chunkable(62500)] + [DetachProperty, Chunkable(62500)] public List EdgesValue { get => @@ -241,7 +241,7 @@ public class Brep : Base, IHasArea, IHasVolume, IHasBoundingBox, ITransformable< /// /// This is only used for the class serialisation/deserialisation. You should use instead. /// - [DetachProperty, SchemaIgnore, Chunkable(62500)] + [DetachProperty, Chunkable(62500)] public List LoopsValue { get => @@ -297,7 +297,7 @@ public class Brep : Base, IHasArea, IHasVolume, IHasBoundingBox, ITransformable< /// /// This is only used for the class serialisation/deserialisation. You should use instead. /// - [DetachProperty, SchemaIgnore, Chunkable(62500)] + [DetachProperty, Chunkable(62500)] public List TrimsValue { get @@ -363,7 +363,7 @@ public class Brep : Base, IHasArea, IHasVolume, IHasBoundingBox, ITransformable< /// /// This is only used for the class serialisation/deserialisation. You should use instead. /// - [DetachProperty, SchemaIgnore, Chunkable(62500)] + [DetachProperty, Chunkable(62500)] public List FacesValue { get => diff --git a/src/Speckle.Sdk/Host/Attributes.cs b/src/Speckle.Sdk/Host/Attributes.cs deleted file mode 100644 index b30e6989..00000000 --- a/src/Speckle.Sdk/Host/Attributes.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace Speckle.Sdk.Host; - -// TODO: this could be nuked, as it's only used to hide props on Base, -// which we might want to expose anyways... -/// -/// Used to ignore properties from expand objects etc -/// -[AttributeUsage(AttributeTargets.Property)] -public sealed class SchemaIgnoreAttribute : Attribute; - -[AttributeUsage(AttributeTargets.Method)] -public sealed class SchemaComputedAttribute(string name) : Attribute -{ - public string Name { get; } = name; -} diff --git a/src/Speckle.Sdk/Models/Base.cs b/src/Speckle.Sdk/Models/Base.cs index 45b8efed..33a4886a 100644 --- a/src/Speckle.Sdk/Models/Base.cs +++ b/src/Speckle.Sdk/Models/Base.cs @@ -28,20 +28,17 @@ public class Base : DynamicBase, ISpeckleObject /// /// A speckle object's id is an unique hash based on its properties. NOTE: this field will be null unless the object was deserialised from a source. Use the function to get it. /// - [SchemaIgnore] public virtual string? id { get; set; } /// /// Secondary, ideally host application driven, object identifier. /// - [SchemaIgnore] public string? applicationId { get; set; } /// /// Holds the type information of this speckle object, derived automatically /// from its assembly name and inheritance. /// - [SchemaIgnore] public virtual string speckle_type { get @@ -210,11 +207,7 @@ public class Base : DynamicBase, ISpeckleObject myDuplicate.id = id; myDuplicate.applicationId = applicationId; - foreach ( - var kvp in GetMembers( - DynamicBaseMemberType.Instance | DynamicBaseMemberType.Dynamic | DynamicBaseMemberType.SchemaIgnored - ) - ) + foreach (var kvp in GetMembers()) { var propertyInfo = type.GetProperty(kvp.Key); if (propertyInfo is not null && !propertyInfo.CanWrite) diff --git a/src/Speckle.Sdk/Models/DynamicBase.cs b/src/Speckle.Sdk/Models/DynamicBase.cs index 483bda4a..e7f3e953 100644 --- a/src/Speckle.Sdk/Models/DynamicBase.cs +++ b/src/Speckle.Sdk/Models/DynamicBase.cs @@ -1,7 +1,6 @@ using System.Dynamic; using System.Reflection; using Speckle.Newtonsoft.Json; -using Speckle.Sdk.Common; using Speckle.Sdk.Host; namespace Speckle.Sdk.Models; @@ -233,16 +232,12 @@ public class DynamicBase : DynamicObject, IDynamicMetaObjectProvider .GetBaseProperties(GetType()) .Where(x => { - var hasIgnored = x.IsDefined(typeof(SchemaIgnoreAttribute), true); var hasObsolete = x.IsDefined(typeof(ObsoleteAttribute), true); // If obsolete is false and prop has obsolete attr // OR // If schemaIgnored is true and prop has schemaIgnore attr - return !( - !includeMembers.HasFlag(DynamicBaseMemberType.SchemaIgnored) && hasIgnored - || !includeMembers.HasFlag(DynamicBaseMemberType.Obsolete) && hasObsolete - ); + return !(!includeMembers.HasFlag(DynamicBaseMemberType.Obsolete) && hasObsolete); }); foreach (var pi in pinfos) { @@ -252,20 +247,6 @@ public class DynamicBase : DynamicObject, IDynamicMetaObjectProvider } } } - - if (includeMembers.HasFlag(DynamicBaseMemberType.SchemaComputed)) - { - GetType() - .GetMethods() - .Where(e => e.IsDefined(typeof(SchemaComputedAttribute)) && !e.IsDefined(typeof(ObsoleteAttribute))) - .ToList() - .ForEach(e => - { - var attr = e.GetCustomAttribute().NotNull(); - dic[attr.Name] = e.Invoke(this, null); - }); - } - return dic; } diff --git a/src/Speckle.Sdk/Models/DynamicBaseMemberType.cs b/src/Speckle.Sdk/Models/DynamicBaseMemberType.cs index 3403bf2a..fc114380 100644 --- a/src/Speckle.Sdk/Models/DynamicBaseMemberType.cs +++ b/src/Speckle.Sdk/Models/DynamicBaseMemberType.cs @@ -1,5 +1,3 @@ -using Speckle.Sdk.Host; - namespace Speckle.Sdk.Models; /// @@ -23,23 +21,18 @@ public enum DynamicBaseMemberType /// Obsolete = 4, - /// - /// The typed members flagged with attribute. - /// - SchemaIgnored = 8, - /// /// The typed methods flagged with TODO: /// SchemaComputed = 16, /// - /// All the typed members, including ones with or attributes. + /// All the typed members, including ones with attributes. /// - InstanceAll = Instance + Obsolete + SchemaIgnored, + InstanceAll = Instance + Obsolete, /// - /// All the members, including dynamic and instance members flagged with or attributes + /// All the members, including dynamic and instance members flagged with attributes /// All = InstanceAll + Dynamic, } From 5900a3c1784e5f6faed16e79bd0c1d76cb0f91e5 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Thu, 6 Mar 2025 12:00:57 +0000 Subject: [PATCH 15/37] compiles --- src/Speckle.Objects/Geometry/Brep.cs | 1 - tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs | 7 ++----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/Speckle.Objects/Geometry/Brep.cs b/src/Speckle.Objects/Geometry/Brep.cs index c02ea6d6..345bb3a1 100644 --- a/src/Speckle.Objects/Geometry/Brep.cs +++ b/src/Speckle.Objects/Geometry/Brep.cs @@ -3,7 +3,6 @@ using Speckle.Newtonsoft.Json; using Speckle.Objects.Other; using Speckle.Objects.Primitive; using Speckle.Sdk.Common; -using Speckle.Sdk.Host; using Speckle.Sdk.Models; namespace Speckle.Objects.Geometry; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs index c658b48a..901ea9f6 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs @@ -154,7 +154,7 @@ public class BaseTests var @base = new SampleObject(); @base["dynamicProp"] = 123; - var names = @base.GetMembers(DynamicBaseMemberType.Instance | DynamicBaseMemberType.SchemaIgnored).Keys; + var names = @base.GetMembers(DynamicBaseMemberType.Instance).Keys; names.Should().Contain(nameof(@base.IgnoredSchemaProp)); names.Should().Contain(nameof(@base.attachedProp)); } @@ -208,8 +208,7 @@ public class BaseTests var sample = new SampleObject(); var copy = sample.ShallowCopy(); - var selectedMembers = - DynamicBaseMemberType.Dynamic | DynamicBaseMemberType.Instance | DynamicBaseMemberType.SchemaIgnored; + var selectedMembers = DynamicBaseMemberType.Dynamic | DynamicBaseMemberType.Instance; var sampleMembers = sample.GetMembers(selectedMembers); var copyMembers = copy.GetMembers(selectedMembers); @@ -232,8 +231,6 @@ public class BaseTests public SampleProp attachedProp { get; set; } public string crazyProp { get; set; } - - [SchemaIgnore] public string IgnoredSchemaProp { get; set; } [Obsolete("Use attached prop")] From 375f5071ae510f0e9b44d3af79ed225e61da72df Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Thu, 6 Mar 2025 13:20:11 +0000 Subject: [PATCH 16/37] Improve test coverage by adding tests and removing unused code (#240) * maybe all objects need to be false * fmt * remove extra code form hosts * fix build * add speckle serializer exception test * add DownloadObjects and DownloadSingleObject test * fmt * add HasObjects test * BaseItem tests * adjust code and add test for UploadObjects * Remove try/catch * can't test compressed? use lib to parse multipart * remove unused verify snapshots --- Directory.Packages.props | 4 +- src/Speckle.Sdk/Host/Attributes.cs | 54 +---- src/Speckle.Sdk/Host/HostApplications.cs | 177 -------------- .../Serialisation/V2/Send/BaseItem.cs | 5 +- .../Serialisation/V2/Send/EmptyDictionary.cs | 47 ---- .../Serialisation/V2/ServerObjectManager.cs | 19 +- .../V2/ServerObjectManagerFactory.cs | 11 +- .../ExceptionTests.cs | 20 ++ .../SerializationTypeTests.cs | 36 +++ ...ManagerTests.DownloadObjects.verified.json | 10 + ...erTests.DownloadSingleObject.verified.json | 4 + ...bjectManagerTests.HasObjects.verified.json | 4 + .../ServerObjectManagerTests.cs | 229 ++++++++++++++++++ .../Speckle.Sdk.Serialization.Tests.csproj | 5 +- .../packages.lock.json | 49 ++++ .../DummyReceiveServerObjectManager.cs | 4 +- .../Framework/DummySendServerObjectManager.cs | 5 +- 17 files changed, 389 insertions(+), 294 deletions(-) delete mode 100644 src/Speckle.Sdk/Serialisation/V2/Send/EmptyDictionary.cs create mode 100644 tests/Speckle.Sdk.Serialization.Tests/SerializationTypeTests.cs create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadObjects.verified.json create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadSingleObject.verified.json create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.HasObjects.verified.json create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 3f6002d6..a9f44a4e 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,6 +6,7 @@ + @@ -21,6 +22,7 @@ + @@ -35,4 +37,4 @@ - + \ No newline at end of file diff --git a/src/Speckle.Sdk/Host/Attributes.cs b/src/Speckle.Sdk/Host/Attributes.cs index 5887f6af..b30e6989 100644 --- a/src/Speckle.Sdk/Host/Attributes.cs +++ b/src/Speckle.Sdk/Host/Attributes.cs @@ -1,63 +1,15 @@ namespace Speckle.Sdk.Host; -[AttributeUsage(AttributeTargets.Constructor)] -public sealed class SchemaInfoAttribute : Attribute -{ - public SchemaInfoAttribute(string name, string description) - : this(name, description, null, null) { } - - public SchemaInfoAttribute(string name, string description, string? category, string? subcategory) - { - Name = name; - Description = description; - Category = category; - Subcategory = subcategory; - } - - public string? Subcategory { get; } - - public string? Category { get; } - - public string Description { get; } - - public string Name { get; } -} - -[AttributeUsage(AttributeTargets.Constructor)] -public sealed class SchemaDeprecatedAttribute : Attribute { } - -[AttributeUsage(AttributeTargets.Parameter)] -public sealed class SchemaParamInfoAttribute : Attribute -{ - public SchemaParamInfoAttribute(string description) - { - Description = description; - } - - public string Description { get; } -} - -/// -/// Used to indicate which is the main input parameter of the schema builder component. Schema info will be attached to this object. -/// -[AttributeUsage(AttributeTargets.Parameter)] -public sealed class SchemaMainParamAttribute : Attribute { } - // TODO: this could be nuked, as it's only used to hide props on Base, // which we might want to expose anyways... /// /// Used to ignore properties from expand objects etc /// [AttributeUsage(AttributeTargets.Property)] -public sealed class SchemaIgnoreAttribute : Attribute { } +public sealed class SchemaIgnoreAttribute : Attribute; [AttributeUsage(AttributeTargets.Method)] -public sealed class SchemaComputedAttribute : Attribute +public sealed class SchemaComputedAttribute(string name) : Attribute { - public SchemaComputedAttribute(string name) - { - Name = name; - } - - public string Name { get; } + public string Name { get; } = name; } diff --git a/src/Speckle.Sdk/Host/HostApplications.cs b/src/Speckle.Sdk/Host/HostApplications.cs index fc38d763..2abced0a 100644 --- a/src/Speckle.Sdk/Host/HostApplications.cs +++ b/src/Speckle.Sdk/Host/HostApplications.cs @@ -1,5 +1,3 @@ -using System.Diagnostics.Contracts; - namespace Speckle.Sdk.Host; /// @@ -42,179 +40,4 @@ public static class HostApplications Navisworks = new("Navisworks", "navisworks"), AdvanceSteel = new("Advance Steel", "advancesteel"), Other = new("Other", "other"); - - /// - /// Gets a HostApplication form a string. It could be the versioned name or a string coming from a process running. - /// - /// String with the name of the app - /// - [Pure] - public static HostApplication GetHostAppFromString(string? appname) - { - if (appname == null) - { - return Other; - } - - appname = appname.ToLowerInvariant().Replace(" ", ""); - if (appname.Contains("dynamo")) - { - return Dynamo; - } - - if (appname.Contains("revit")) - { - return Revit; - } - - if (appname.Contains("autocad")) - { - return AutoCAD; - } - if (appname.Contains("civil3d")) - { - return Civil3D; - } - if (appname.Contains("civil")) - { - return Civil; - } - - if (appname.Contains("rhino")) - { - return Rhino; - } - - if (appname.Contains("grasshopper")) - { - return Grasshopper; - } - - if (appname.Contains("unity")) - { - return Unity; - } - - if (appname.Contains("gsa")) - { - return GSA; - } - - if (appname.Contains("microstation")) - { - return MicroStation; - } - - if (appname.Contains("openroads")) - { - return OpenRoads; - } - - if (appname.Contains("openrail")) - { - return OpenRail; - } - - if (appname.Contains("openbuildings")) - { - return OpenBuildings; - } - - if (appname.Contains("etabs")) - { - return ETABS; - } - - if (appname.Contains("sap")) - { - return SAP2000; - } - - if (appname.Contains("csibridge")) - { - return CSiBridge; - } - - if (appname.Contains("safe")) - { - return SAFE; - } - - if (appname.Contains("teklastructures")) - { - return TeklaStructures; - } - - if (appname.Contains("dxf")) - { - return Dxf; - } - - if (appname.Contains("excel")) - { - return Excel; - } - - if (appname.Contains("unreal")) - { - return Unreal; - } - - if (appname.Contains("powerbi")) - { - return PowerBI; - } - - if (appname.Contains("blender")) - { - return Blender; - } - - if (appname.Contains("qgis")) - { - return QGIS; - } - - if (appname.Contains("arcgis")) - { - return ArcGIS; - } - - if (appname.Contains("sketchup")) - { - return SketchUp; - } - - if (appname.Contains("archicad")) - { - return Archicad; - } - - if (appname.Contains("topsolid")) - { - return TopSolid; - } - - if (appname.Contains("python")) - { - return Python; - } - - if (appname.Contains("net")) - { - return NET; - } - - if (appname.Contains("navisworks")) - { - return Navisworks; - } - - if (appname.Contains("advancesteel")) - { - return AdvanceSteel; - } - - return new HostApplication(appname, appname); - } } diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs b/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs index f5c39f4b..2a88e3db 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Send/BaseItem.cs @@ -2,8 +2,7 @@ using System.Text; namespace Speckle.Sdk.Serialisation.V2.Send; -public readonly record struct BaseItem(Id Id, Json Json, bool NeedsStorage, Dictionary? Closures) - : IHasByteSize +public sealed record BaseItem(Id Id, Json Json, bool NeedsStorage, Dictionary? Closures) : IHasByteSize { public int ByteSize { get; } = Encoding.UTF8.GetByteCount(Json.Value); @@ -13,7 +12,7 @@ public readonly record struct BaseItem(Id Id, Json Json, bool NeedsStorage, Dict { return false; } - return string.Equals(Id.Value, other.Value.Id.Value, StringComparison.OrdinalIgnoreCase); + return string.Equals(Id.Value, other.Id.Value, StringComparison.OrdinalIgnoreCase); } public override int GetHashCode() => Id.GetHashCode(); diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/EmptyDictionary.cs b/src/Speckle.Sdk/Serialisation/V2/Send/EmptyDictionary.cs deleted file mode 100644 index 7059231a..00000000 --- a/src/Speckle.Sdk/Serialisation/V2/Send/EmptyDictionary.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Collections; -using System.Diagnostics.CodeAnalysis; - -namespace Speckle.Sdk.Serialisation.V2.Send; - -public class EmptyDictionary : IDictionary -{ - public IEnumerator> GetEnumerator() => throw new NotImplementedException(); - - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); - - public void Add(KeyValuePair item) { } - - public void Clear() => throw new NotImplementedException(); - - public bool Contains(KeyValuePair item) => false; - - public void CopyTo(KeyValuePair[] array, int arrayIndex) => throw new NotImplementedException(); - - public bool Remove(KeyValuePair item) => false; - - public int Count => 0; - public bool IsReadOnly => false; - - public void Add(TKey key, TValue value) { } - - public bool ContainsKey(TKey key) => false; - - public bool Remove(TKey key) => false; - - public bool TryGetValue(TKey key, [UnscopedRef] out TValue value) - { - value = default!; - return false; - } - - public TValue this[TKey key] - { -#pragma warning disable CA1065 - get => throw new NotImplementedException(); -#pragma warning restore CA1065 - set { } - } - - public ICollection Keys { get; } - public ICollection Values { get; } -} diff --git a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs index 895a4a6f..e196c890 100644 --- a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs +++ b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManager.cs @@ -13,6 +13,12 @@ using Speckle.Sdk.Transports.ServerUtils; namespace Speckle.Sdk.Serialisation.V2; +public class ServerObjectManagerOptions(TimeSpan? timeout = null, string? boundary = null) +{ + public TimeSpan Timeout => timeout ?? TimeSpan.FromSeconds(120); + public string Boundary => boundary ??= Guid.NewGuid().ToString(); +} + [GenerateAutoInterface] public class ServerObjectManager : IServerObjectManager { @@ -21,6 +27,7 @@ public class ServerObjectManager : IServerObjectManager private readonly ISdkActivityFactory _activityFactory; private readonly HttpClient _client; private readonly string _streamId; + private readonly ServerObjectManagerOptions _serverObjectManagerOptions; public ServerObjectManager( ISpeckleHttp speckleHttp, @@ -28,13 +35,14 @@ public class ServerObjectManager : IServerObjectManager Uri baseUri, string streamId, string? authorizationToken, - int timeoutSeconds = 120 + ServerObjectManagerOptions? options = null ) { + _serverObjectManagerOptions = options ?? new(); _activityFactory = activityFactory; _client = speckleHttp.CreateHttpClient( new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip }, - timeoutSeconds: timeoutSeconds, + timeoutSeconds: (int)_serverObjectManagerOptions.Timeout.TotalSeconds, authorizationToken: authorizationToken ); _client.BaseAddress = baseUri; @@ -139,10 +147,8 @@ public class ServerObjectManager : IServerObjectManager CancellationToken cancellationToken ) { + using var _ = _activityFactory.Start(); cancellationToken.ThrowIfCancellationRequested(); - - // Stopwatch sw = new Stopwatch(); sw.Start(); - string objectsPostParameter = JsonConvert.SerializeObject(objectIds); var payload = new Dictionary { { "objects", objectsPostParameter } }; string serializedPayload = JsonConvert.SerializeObject(payload); @@ -169,6 +175,7 @@ public class ServerObjectManager : IServerObjectManager CancellationToken cancellationToken ) { + using var _ = _activityFactory.Start(); cancellationToken.ThrowIfCancellationRequested(); using HttpRequestMessage message = new() @@ -177,7 +184,7 @@ public class ServerObjectManager : IServerObjectManager Method = HttpMethod.Post, }; - MultipartFormDataContent multipart = new(); + MultipartFormDataContent multipart = new(_serverObjectManagerOptions.Boundary); int mpId = 0; var ctBuilder = new StringBuilder("["); diff --git a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManagerFactory.cs b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManagerFactory.cs index 071a62b5..0fba82bf 100644 --- a/src/Speckle.Sdk/Serialisation/V2/ServerObjectManagerFactory.cs +++ b/src/Speckle.Sdk/Serialisation/V2/ServerObjectManagerFactory.cs @@ -8,6 +8,13 @@ namespace Speckle.Sdk.Serialisation.V2; public class ServerObjectManagerFactory(ISpeckleHttp speckleHttp, ISdkActivityFactory activityFactory) : IServerObjectManagerFactory { - public IServerObjectManager Create(Uri url, string streamId, string? authorizationToken, int timeoutSeconds = 120) => - new ServerObjectManager(speckleHttp, activityFactory, url, streamId, authorizationToken, timeoutSeconds); + public IServerObjectManager Create(Uri url, string streamId, string? authorizationToken, TimeSpan? timeout = null) => + new ServerObjectManager( + speckleHttp, + activityFactory, + url, + streamId, + authorizationToken, + new ServerObjectManagerOptions(timeout: timeout) + ); } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs index a9315b8a..ff22c2b8 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Logging.Abstractions; using Speckle.Objects.Geometry; using Speckle.Sdk.Host; using Speckle.Sdk.Models; +using Speckle.Sdk.Serialisation; using Speckle.Sdk.Serialisation.V2.Receive; using Speckle.Sdk.Serialisation.V2.Send; using Speckle.Sdk.Serialization.Tests.Framework; @@ -144,4 +145,23 @@ public class ExceptionTests } await Verify(ex).UseParameters(hasObject); } + + [SpeckleType("Objects.Geometry.BadBase")] + public class BadBase : Base + { +#pragma warning disable CA1065 + public string BadProp => throw new NotImplementedException(); +#pragma warning restore CA1065 + } + + [Fact] + public void Test_SpeckleSerializerException() + { + var factory = new ObjectSerializerFactory(new BasePropertyGatherer()); + var serializer = factory.Create(new Dictionary(), default); + Assert.Throws(() => + { + var _ = serializer.Serialize(new BadBase()).ToList(); + }); + } } diff --git a/tests/Speckle.Sdk.Serialization.Tests/SerializationTypeTests.cs b/tests/Speckle.Sdk.Serialization.Tests/SerializationTypeTests.cs new file mode 100644 index 00000000..432e5103 --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/SerializationTypeTests.cs @@ -0,0 +1,36 @@ +using FluentAssertions; +using Speckle.Sdk.Serialisation; +using Speckle.Sdk.Serialisation.V2.Send; + +namespace Speckle.Sdk.Serialization.Tests; + +public class SerializationTypeTests +{ + [Fact] + public void Json() + { + var json = new Json("{}"); + json.ToString().Should().Be("{}"); + } + + [Fact] + public void Id() + { + var id = new Id("id"); + id.ToString().Should().Be("id"); + id.Equals(new Id("id")).Should().BeTrue(); + id.Equals(new Id("id2")).Should().BeFalse(); + id.GetHashCode().Should().Be("id".GetHashCode()); + } + + [Fact] + public void BaseItem() + { + var id = new Id("id"); + var json = new Json("{}"); + var baseItem = new BaseItem(id, json, false, new Dictionary()); + baseItem.Equals(new BaseItem(id, json, false, new Dictionary())).Should().BeTrue(); + baseItem.Equals(new BaseItem(new Id("id2"), json, false, new Dictionary())).Should().BeFalse(); + baseItem.GetHashCode().Should().Be(id.GetHashCode()); + } +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadObjects.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadObjects.verified.json new file mode 100644 index 00000000..488ea578 --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadObjects.verified.json @@ -0,0 +1,10 @@ +{ + "6f422a35-6183-48b9-8021-d22ec97e8674": { + "id": "6f422a35-6183-48b9-8021-d22ec97e8674", + "value": true + }, + "ef2f7ea0-495a-46af-a9ad-f18a8a298597": { + "id": "ef2f7ea0-495a-46af-a9ad-f18a8a298597", + "value": true + } +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadSingleObject.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadSingleObject.verified.json new file mode 100644 index 00000000..d9bb684e --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.DownloadSingleObject.verified.json @@ -0,0 +1,4 @@ +{ + "id": "6f422a35-6183-48b9-8021-d22ec97e8674", + "value": true +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.HasObjects.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.HasObjects.verified.json new file mode 100644 index 00000000..4295906d --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.HasObjects.verified.json @@ -0,0 +1,4 @@ +{ + "6f422a35-6183-48b9-8021-d22ec97e8674": true, + "ef2f7ea0-495a-46af-a9ad-f18a8a298597": false +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs new file mode 100644 index 00000000..d31c6441 --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs @@ -0,0 +1,229 @@ +using System.Diagnostics.CodeAnalysis; +using System.Net; +using System.Text; +using FluentAssertions; +using HttpMultipartParser; +using Moq; +using RichardSzalay.MockHttp; +using Speckle.Newtonsoft.Json; +using Speckle.Newtonsoft.Json.Linq; +using Speckle.Sdk.Common; +using Speckle.Sdk.Helpers; +using Speckle.Sdk.Logging; +using Speckle.Sdk.Serialisation; +using Speckle.Sdk.Serialisation.V2; +using Speckle.Sdk.Serialisation.V2.Send; + +namespace Speckle.Sdk.Serialization.Tests; + +[ExcludeFromCodeCoverage] +public abstract class MoqTest : IDisposable +{ + protected MoqTest() => Repository = new(MockBehavior.Strict); + + public void Dispose() => Repository.VerifyAll(); + + protected MockRepository Repository { get; private set; } = new(MockBehavior.Strict); + + protected Mock Create(MockBehavior behavior = MockBehavior.Strict) + where T : class => Repository.Create(behavior); +} + +public class ServerObjectManagerTests : MoqTest +{ + [Fact] + public async Task DownloadObjects() + { + var id = Guid.Parse("6f422a35-6183-48b9-8021-d22ec97e8674").ToString(); + var id2 = Guid.Parse("ef2f7ea0-495a-46af-a9ad-f18a8a298597").ToString(); + var ct = new CancellationToken(); + var token = "token"; + var timeout = 2; + var uri = new Uri("http://localhost"); + var streamId = "streamId"; + var jObject = new JObject { { "id", id }, { "value", true } }; + var jObject2 = new JObject { { "id", id2 }, { "value", true } }; + var mockHttp = new MockHttpMessageHandler(); + Dictionary postParameters = new() + { + { "objects", JsonConvert.SerializeObject(new List { id, id2 }) }, + }; + + string serializedPayload = JsonConvert.SerializeObject(postParameters); + mockHttp + .When(HttpMethod.Post, $"http://localhost/api/getobjects/{streamId}") + .WithContent(serializedPayload) + .Respond( + "application/json", + $"{id}\t{jObject.ToString(Formatting.None)}\n{id2}\t{jObject2.ToString(Formatting.None)}\n" + ); + var httpClient = mockHttp.ToHttpClient(); + var http = Create(); + http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); + + var activityFactory = Create(); + activityFactory.Setup(x => x.Start(null, "DownloadObjects")).Returns((ISdkActivity?)null); + + var serverObjectManager = new ServerObjectManager( + http.Object, + activityFactory.Object, + uri, + streamId, + token, + new(timeout: TimeSpan.FromSeconds(timeout)) + ); + var results = serverObjectManager.DownloadObjects(new List { id, id2 }, null, ct); + var objects = new JObject(); + await foreach (var (x, json) in results) + { + objects.Add(x, JToken.Parse(json)); + } + + await VerifyJson(objects.ToString(Formatting.Indented)); + } + + [Fact] + public async Task DownloadSingleObject() + { + var id = Guid.Parse("6f422a35-6183-48b9-8021-d22ec97e8674").ToString(); + var ct = new CancellationToken(); + var token = "token"; + var timeout = 2; + var uri = new Uri("http://localhost"); + var streamId = "streamId"; + var jObject = new JObject { { "id", id }, { "value", true } }; + var mockHttp = new MockHttpMessageHandler(); + mockHttp + .When(HttpMethod.Get, $"http://localhost/objects/{streamId}/{id}/single") + .Respond("application/json", $"{jObject.ToString(Formatting.None)}\n"); + var httpClient = mockHttp.ToHttpClient(); + var http = Create(); + http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); + + var activityFactory = Create(); + activityFactory.Setup(x => x.Start(null, "DownloadSingleObject")).Returns((ISdkActivity?)null); + + var serverObjectManager = new ServerObjectManager( + http.Object, + activityFactory.Object, + uri, + streamId, + token, + new(timeout: TimeSpan.FromSeconds(timeout)) + ); + var json = await serverObjectManager.DownloadSingleObject(id, null, ct); + await VerifyJson(json); + } + + [Fact] + public async Task HasObjects() + { + var id = Guid.Parse("6f422a35-6183-48b9-8021-d22ec97e8674").ToString(); + var id2 = Guid.Parse("ef2f7ea0-495a-46af-a9ad-f18a8a298597").ToString(); + var ct = new CancellationToken(); + var token = "token"; + var timeout = 2; + var uri = new Uri("http://localhost"); + var streamId = "streamId"; + var mockHttp = new MockHttpMessageHandler(); + Dictionary postParameters = new() + { + { "objects", JsonConvert.SerializeObject(new List { id, id2 }) }, + }; + + Dictionary responseParameters = new() { { id, true }, { id2, false } }; + string serializedPayload = JsonConvert.SerializeObject(postParameters); + mockHttp + .When(HttpMethod.Post, $"http://localhost/api/diff/{streamId}") + .WithContent(serializedPayload) + .Respond("application/json", JsonConvert.SerializeObject(responseParameters)); + var httpClient = mockHttp.ToHttpClient(); + var http = Create(); + http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); + + var activityFactory = Create(); + activityFactory.Setup(x => x.Start(null, "HasObjects")).Returns((ISdkActivity?)null); + + var serverObjectManager = new ServerObjectManager( + http.Object, + activityFactory.Object, + uri, + streamId, + token, + new(timeout: TimeSpan.FromSeconds(timeout)) + ); + var results = await serverObjectManager.HasObjects(new List { id, id2 }, ct); + + await Verify(results); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task UploadObjects(bool compressed) + { + var id = Guid.Parse("6f422a35-6183-48b9-8021-d22ec97e8674").ToString(); + var id2 = Guid.Parse("ef2f7ea0-495a-46af-a9ad-f18a8a298597").ToString(); + var ct = new CancellationToken(); + var token = "token"; + var timeout = 2; + var uri = new Uri("http://localhost"); + var streamId = "streamId"; + var jObject = new JObject { { "id", id }, { "value", true } }; + var jObject2 = new JObject { { "id", id2 }, { "value", true } }; + + var mockHttp = new MockHttpMessageHandler(); + mockHttp + .When(HttpMethod.Post, $"http://localhost/objects/{streamId}") + .Respond(x => HandleUploadRequest(x, compressed, new List { jObject, jObject2 })); + var httpClient = mockHttp.ToHttpClient(); + var http = Create(); + http.Setup(x => x.CreateHttpClient(It.IsAny(), timeout, token)).Returns(httpClient); + + var activityFactory = Create(); + activityFactory.Setup(x => x.Start(null, "UploadObjects")).Returns((ISdkActivity?)null); + + var serverObjectManager = new ServerObjectManager( + http.Object, + activityFactory.Object, + uri, + streamId, + token, + new(timeout: TimeSpan.FromSeconds(timeout), boundary: "boundary") + ); + await serverObjectManager.UploadObjects( + new List + { + new(new(id), new Json(jObject.ToString()), true, null), + new(new(id2), new Json(jObject2.ToString()), true, null), + }, + compressed, + null, + ct + ); + } + + private async Task HandleUploadRequest( + HttpRequestMessage req, + bool compressed, + List objects + ) + { + var content = await req.Content.NotNull().ReadAsStringAsync().ConfigureAwait(false); + var stream = new MemoryStream(Encoding.Default.GetBytes(content)); + var formData = await MultipartFormDataParser.ParseAsync(stream, "boundary"); + formData.Files.Count.Should().Be(1); + var file = formData.Files[0]; + file.FileName.Should().Be("batch-0"); + // file.ContentType.Should().Be("application/json"); + if (!compressed) + { + var dataStream = file.Data; + using var reader = new StreamReader(dataStream); + var s = await reader.ReadToEndAsync(); + JsonConvert.DeserializeObject>(s).Should().BeEquivalentTo(objects); + } + + return new HttpResponseMessage(HttpStatusCode.OK); + } +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj b/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj index 47352da9..3f3689e8 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj +++ b/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj @@ -1,4 +1,4 @@ - + net8.0 @@ -9,7 +9,10 @@ + + + diff --git a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json index d2993f2e..3e40f9b6 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json +++ b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json @@ -20,6 +20,17 @@ "resolved": "5.12.0", "contentHash": "dJuigXycpJNOiLT9or7mkHSkGFHgGW3/p6cNNYEKZBa7Hhp1FdX/cvqYWWYhRLpfoZOedeA7aRbYiOB3vW/dvA==" }, + "HttpMultipartParser": { + "type": "Direct", + "requested": "[9.0.0, )", + "resolved": "9.0.0", + "contentHash": "WeGKDK62waagwo9nokRY62DrLukwVCNXOPVjrzi/qSS73D+B6zPOBkImsFqzhvRNweIobR74js9M2HTV+PTeIg==", + "dependencies": { + "Microsoft.CSharp": "4.7.0", + "Microsoft.IO.RecyclableMemoryStream": "3.0.1", + "System.Buffers": "4.6.0" + } + }, "Microsoft.NET.Test.Sdk": { "type": "Direct", "requested": "[17.13.0, )", @@ -40,12 +51,27 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, + "Moq": { + "type": "Direct", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, "PolySharp": { "type": "Direct", "requested": "[1.15.0, )", "resolved": "1.15.0", "contentHash": "FbU0El+EEjdpuIX4iDbeS7ki1uzpJPx8vbqOzEtqnl1GZeAGJfq+jCbxeJL2y0EPnUNk8dRnnqR2xnYXg9Tf+g==" }, + "RichardSzalay.MockHttp": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "QwnauYiaywp65QKFnP+wvgiQ2D8Pv888qB2dyfd7MSVDF06sIvxqASenk+RxsWybyyt+Hu1Y251wQxpHTv3UYg==" + }, "Speckle.InterfaceGenerator": { "type": "Direct", "requested": "[0.9.6, )", @@ -69,6 +95,14 @@ "resolved": "0.26.0", "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, "DiffEngine": { "type": "Transitive", "resolved": "15.9.0", @@ -175,6 +209,11 @@ "System.Runtime.CompilerServices.Unsafe": "4.5.1" } }, + "Microsoft.IO.RecyclableMemoryStream": { + "type": "Transitive", + "resolved": "3.0.1", + "contentHash": "s/s20YTVY9r9TPfTrN5g8zPF1YhwxyqO6PxUkrYTGI2B+OGPe9AdajWZrLhFqXIvqIW23fnUE4+ztrUWNU1+9g==" + }, "Microsoft.SourceLink.Common": { "type": "Transitive", "resolved": "8.0.0", @@ -246,6 +285,11 @@ "SQLitePCLRaw.core": "2.1.4" } }, + "System.Buffers": { + "type": "Transitive", + "resolved": "4.6.0", + "contentHash": "lN6tZi7Q46zFzAbRYXTIvfXcyvQQgxnY7Xm6C6xQ9784dEL1amjM6S6Iw4ZpsvesAKnRVsM4scrDQaDqSClkjA==" + }, "System.CodeDom": { "type": "Transitive", "resolved": "9.0.1", @@ -256,6 +300,11 @@ "resolved": "4.5.0", "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, "System.IO.Hashing": { "type": "Transitive", "resolved": "9.0.1", diff --git a/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs b/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs index 75787dc7..e038f33c 100644 --- a/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs +++ b/tests/Speckle.Sdk.Testing/Framework/DummyReceiveServerObjectManager.cs @@ -37,14 +37,14 @@ public class DummyReceiveServerObjectManager(IReadOnlyDictionary ) => throw new NotImplementedException(); public Task UploadObjects( - IReadOnlyList objects, + IReadOnlyList objectsToUpload, bool compressPayloads, IProgress? progress, CancellationToken cancellationToken ) { long totalBytes = 0; - foreach (var item in objects) + foreach (var item in objectsToUpload) { totalBytes += Encoding.Default.GetByteCount(item.Json.Value); } diff --git a/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs b/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs index 0ae163c4..ca46a915 100644 --- a/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs +++ b/tests/Speckle.Sdk.Testing/Framework/DummySendServerObjectManager.cs @@ -22,10 +22,7 @@ public class DummySendServerObjectManager(ConcurrentDictionary s public Task> HasObjects( IReadOnlyCollection objectIds, CancellationToken cancellationToken - ) - { - return Task.FromResult(objectIds.Distinct().ToDictionary(x => x, savedObjects.ContainsKey)); - } + ) => Task.FromResult(objectIds.Distinct().ToDictionary(x => x, _ => false)); public Task UploadObjects( IReadOnlyList objects, From 96822c4e66528a3b16e71d67b7f1f94ed19b4610 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Thu, 6 Mar 2025 16:55:01 +0000 Subject: [PATCH 17/37] Fix tests --- tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs | 1 - .../Models/Extensions/BaseExtensionsTests.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs index 901ea9f6..9cd1ab75 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs @@ -120,7 +120,6 @@ public class BaseTests var dynamicProp = "dynamicProp"; @base[dynamicProp] = 123; var names = @base.GetMembers().Keys; - names.Should().NotContain(nameof(@base.IgnoredSchemaProp)); names.Should().NotContain(nameof(@base.ObsoleteSchemaProp)); names.Should().Contain(dynamicProp); names.Should().Contain(nameof(@base.attachedProp)); diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs index f0a24de5..842946b8 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs @@ -12,7 +12,7 @@ public class BaseExtensionsTests public BaseExtensionsTests() { TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Base).Assembly); + TypeLoader.Initialize(typeof(Base).Assembly, typeof(TestBase).Assembly); } [Theory] From ba655988b08151e83ed5437809ca26c10ad86629 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Fri, 7 Mar 2025 08:39:51 +0000 Subject: [PATCH 18/37] Show code coverage for dev --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5a437272..b5cbd214 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Speckle | Sharp | SDK ### .NET SDK, Tests, and Objects -[![Codecov](https://codecov.io/gh/specklesystems/speckle-sharp-sdk/graph/badge.svg?token=TTM5OGr38m)](https://codecov.io/gh/specklesystems/speckle-sharp-sdk) +[![codecov](https://codecov.io/gh/specklesystems/speckle-sharp-sdk/branch/dev/graph/badge.svg?token=TTM5OGr38m)](https://codecov.io/gh/specklesystems/speckle-sharp-sdk) > [!WARNING] > This is an early beta release, not meant for use in production! We're working to stabilise the 3.0 API, and until then there will be breaking changes. You have been warned! From 14732ce1749b1a33c94008e75c5563034e8692f8 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Fri, 7 Mar 2025 09:03:07 +0000 Subject: [PATCH 19/37] SpeckleHttp coverage and moved base stuff around --- .../Helpers/{Http.cs => SpeckleHttp.cs} | 7 +- .../packages.lock.json | 49 +++++ .../ServerObjectManagerTests.cs | 13 +- .../packages.lock.json | 27 +++ tests/Speckle.Sdk.Testing/MoqTest.cs | 17 ++ .../Speckle.Sdk.Testing.csproj | 2 + tests/Speckle.Sdk.Testing/packages.lock.json | 53 ++++++ .../GraphQL/GraphQLClientExceptionHandling.cs | 2 +- .../Resources/ActiveUserResourceTests.cs | 2 +- .../GraphQL/Resources/CommentResourceTests.cs | 2 +- .../ModelResourceExceptionalTests.cs | 2 +- .../GraphQL/Resources/ModelResourceTests.cs | 2 +- .../Resources/OtherUserResourceTests.cs | 2 +- .../ProjectInviteResourceExceptionalTests.cs | 2 +- .../Resources/ProjectInviteResourceTests.cs | 2 +- .../ProjectResourceExceptionalTests.cs | 2 +- .../GraphQL/Resources/ProjectResourceTests.cs | 2 +- .../Resources/SubscriptionResourceTests.cs | 2 +- .../GraphQL/Resources/VersionResourceTests.cs | 2 +- .../Credentials/UserServerInfoTests.cs | 2 +- .../MemoryTransportTests.cs | 2 +- .../packages.lock.json | 149 +++++++++++++++- .../Api/ClientResiliencyPolicyTest.cs | 2 +- .../Api/GraphQL/Client.cs | 6 + .../Api/GraphQLErrorHandler.cs | 2 +- .../Api/Operations/ClosureTests.cs | 2 +- .../OperationsReceiveTests.Exceptional.cs | 2 +- .../Api/Operations/OperationsReceiveTests.cs | 2 +- .../Api/Operations/SendObjectReferences.cs | 2 +- .../Api/Operations/SendReceiveLocal.cs | 2 +- .../Api/Operations/SerializationTests.cs | 2 +- tests/Speckle.Sdk.Tests.Unit/Assembly.cs | 2 +- .../Common/NotNullTests.cs | 2 +- .../Common/RangeFromTests.cs | 2 +- .../Common/UnitsTest.cs | 2 +- .../AccountServerMigrationTests.cs | 2 +- .../Credentials/Accounts.cs | 2 +- tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs | 2 +- .../Helpers/SpeckleHttp.cs | 21 +++ .../Host/HostApplicationTests.cs | 2 +- .../Models/BaseTests.cs | 2 +- .../Models/Extensions/BaseExtensionsTests.cs | 2 +- .../Models/Extensions/DisplayValueTests.cs | 2 +- .../Models/Extensions/ExceptionTests.cs | 2 +- .../GraphTraversal/GraphTraversalTests.cs | 2 +- .../TraversalContextExtensionsTests.cs | 2 +- .../Speckle.Sdk.Tests.Unit/Models/Hashing.cs | 2 +- .../Models/SpeckleType.cs | 2 +- .../Models/TraversalTests.cs | 2 +- .../Models/UtilitiesTests.cs | 2 +- .../SQLite/SQLiteJsonCacheManagerTests.cs | 2 +- .../SQLite/SQLiteJsonExceptionTests.cs | 2 +- .../Serialisation/BatchTests.cs | 2 +- .../Serialisation/ChunkingTests.cs | 2 +- .../Serialisation/JsonIgnoreAttributeTests.cs | 2 +- .../ObjectModelDeprecationTests.cs | 2 +- .../SerializerBreakingChanges.cs | 2 +- .../SerializerNonBreakingChanges.cs | 2 +- .../Serialisation/SimpleRoundTripTests.cs | 2 +- .../Speckle.Sdk.Tests.Unit.csproj | 3 +- .../Transports/DiskTransportTests.cs | 2 +- .../Transports/MemoryTransportTests.cs | 2 +- .../Transports/SQLiteTransport2Tests.cs | 2 +- .../Transports/SQLiteTransportTests.cs | 2 +- .../Transports/TransportTests.cs | 2 +- .../Speckle.Sdk.Tests.Unit/packages.lock.json | 168 ++++++++++++++++-- 66 files changed, 543 insertions(+), 80 deletions(-) rename src/Speckle.Sdk/Helpers/{Http.cs => SpeckleHttp.cs} (92%) create mode 100644 tests/Speckle.Sdk.Testing/MoqTest.cs create mode 100644 tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs create mode 100644 tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttp.cs diff --git a/src/Speckle.Sdk/Helpers/Http.cs b/src/Speckle.Sdk/Helpers/SpeckleHttp.cs similarity index 92% rename from src/Speckle.Sdk/Helpers/Http.cs rename to src/Speckle.Sdk/Helpers/SpeckleHttp.cs index a468abd0..425e4559 100644 --- a/src/Speckle.Sdk/Helpers/Http.cs +++ b/src/Speckle.Sdk/Helpers/SpeckleHttp.cs @@ -15,10 +15,15 @@ public class SpeckleHttp(ILogger logger, ISpeckleHttpClientHandlerF /// The URI that should be pinged /// Request to failed public async Task HttpPing(Uri uri) + { + using var httpClient = CreateHttpClient(); + return await HttpPing(uri, httpClient).ConfigureAwait(false); + } + + public async Task HttpPing(Uri uri, HttpClient httpClient) { try { - using var httpClient = CreateHttpClient(); HttpResponseMessage response = await httpClient.GetAsync(uri).ConfigureAwait(false); response.EnsureSuccessStatusCode(); logger.LogInformation("Successfully pinged {uri}", uri); diff --git a/tests/Speckle.Objects.Tests.Unit/packages.lock.json b/tests/Speckle.Objects.Tests.Unit/packages.lock.json index d2993f2e..ee89df73 100644 --- a/tests/Speckle.Objects.Tests.Unit/packages.lock.json +++ b/tests/Speckle.Objects.Tests.Unit/packages.lock.json @@ -69,6 +69,14 @@ "resolved": "0.26.0", "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, "DiffEngine": { "type": "Transitive", "resolved": "15.9.0", @@ -256,6 +264,11 @@ "resolved": "4.5.0", "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, "System.IO.Hashing": { "type": "Transitive", "resolved": "9.0.1", @@ -318,6 +331,20 @@ "resolved": "2.0.3", "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.18.0", + "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ==" + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.9.3", + "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", + "dependencies": { + "xunit.extensibility.core": "[2.9.3]", + "xunit.extensibility.execution": "[2.9.3]" + } + }, "xunit.extensibility.core": { "type": "Transitive", "resolved": "2.9.3", @@ -360,9 +387,11 @@ "type": "Project", "dependencies": { "Microsoft.NET.Test.Sdk": "[17.13.0, )", + "Moq": "[4.20.70, )", "Speckle.Sdk": "[1.0.0, )", "Verify.Quibble": "[2.1.1, )", "Verify.Xunit": "[28.10.1, )", + "xunit": "[2.9.3, )", "xunit.runner.visualstudio": "[3.0.2, )" } }, @@ -411,6 +440,15 @@ "Microsoft.Extensions.Options": "2.2.0" } }, + "Moq": { + "type": "CentralTransitive", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, "Speckle.DoubleNumerics": { "type": "CentralTransitive", "requested": "[4.1.0, )", @@ -448,6 +486,17 @@ "xunit.abstractions": "2.0.3", "xunit.extensibility.execution": "2.9.3" } + }, + "xunit": { + "type": "CentralTransitive", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "dependencies": { + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" + } } } } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs index d31c6441..89a4d831 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs @@ -13,21 +13,10 @@ using Speckle.Sdk.Logging; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Serialisation.V2; using Speckle.Sdk.Serialisation.V2.Send; +using Speckle.Sdk.Testing; namespace Speckle.Sdk.Serialization.Tests; -[ExcludeFromCodeCoverage] -public abstract class MoqTest : IDisposable -{ - protected MoqTest() => Repository = new(MockBehavior.Strict); - - public void Dispose() => Repository.VerifyAll(); - - protected MockRepository Repository { get; private set; } = new(MockBehavior.Strict); - - protected Mock Create(MockBehavior behavior = MockBehavior.Strict) - where T : class => Repository.Create(behavior); -} public class ServerObjectManagerTests : MoqTest { diff --git a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json index 3e40f9b6..977c8c56 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json +++ b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json @@ -367,6 +367,20 @@ "resolved": "2.0.3", "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.18.0", + "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ==" + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.9.3", + "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", + "dependencies": { + "xunit.extensibility.core": "[2.9.3]", + "xunit.extensibility.execution": "[2.9.3]" + } + }, "xunit.extensibility.core": { "type": "Transitive", "resolved": "2.9.3", @@ -409,9 +423,11 @@ "type": "Project", "dependencies": { "Microsoft.NET.Test.Sdk": "[17.13.0, )", + "Moq": "[4.20.70, )", "Speckle.Sdk": "[1.0.0, )", "Verify.Quibble": "[2.1.1, )", "Verify.Xunit": "[28.10.1, )", + "xunit": "[2.9.3, )", "xunit.runner.visualstudio": "[3.0.2, )" } }, @@ -497,6 +513,17 @@ "xunit.abstractions": "2.0.3", "xunit.extensibility.execution": "2.9.3" } + }, + "xunit": { + "type": "CentralTransitive", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "dependencies": { + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" + } } } } diff --git a/tests/Speckle.Sdk.Testing/MoqTest.cs b/tests/Speckle.Sdk.Testing/MoqTest.cs new file mode 100644 index 00000000..34e8391b --- /dev/null +++ b/tests/Speckle.Sdk.Testing/MoqTest.cs @@ -0,0 +1,17 @@ +using System.Diagnostics.CodeAnalysis; +using Moq; + +namespace Speckle.Sdk.Testing; + +[ExcludeFromCodeCoverage] +public abstract class MoqTest : IDisposable +{ + protected MoqTest() => Repository = new(MockBehavior.Strict); + + public void Dispose() => Repository.VerifyAll(); + + protected MockRepository Repository { get; private set; } = new(MockBehavior.Strict); + + protected Mock Create(MockBehavior behavior = MockBehavior.Strict) + where T : class => Repository.Create(behavior); +} diff --git a/tests/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj b/tests/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj index b5ecb4ed..2238b7c0 100644 --- a/tests/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj +++ b/tests/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj @@ -7,8 +7,10 @@ + + diff --git a/tests/Speckle.Sdk.Testing/packages.lock.json b/tests/Speckle.Sdk.Testing/packages.lock.json index 9ea626a4..efeb5300 100644 --- a/tests/Speckle.Sdk.Testing/packages.lock.json +++ b/tests/Speckle.Sdk.Testing/packages.lock.json @@ -28,6 +28,15 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, + "Moq": { + "type": "Direct", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, "PolySharp": { "type": "Direct", "requested": "[1.15.0, )", @@ -66,6 +75,17 @@ "xunit.extensibility.execution": "2.9.3" } }, + "xunit": { + "type": "Direct", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "dependencies": { + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" + } + }, "xunit.runner.visualstudio": { "type": "Direct", "requested": "[3.0.2, )", @@ -77,6 +97,14 @@ "resolved": "0.26.0", "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, "DiffEngine": { "type": "Transitive", "resolved": "15.9.0", @@ -264,6 +292,11 @@ "resolved": "4.5.0", "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, "System.IO.Hashing": { "type": "Transitive", "resolved": "9.0.1", @@ -326,6 +359,20 @@ "resolved": "2.0.3", "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.18.0", + "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ==" + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.9.3", + "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", + "dependencies": { + "xunit.extensibility.core": "[2.9.3]", + "xunit.extensibility.execution": "[2.9.3]" + } + }, "xunit.extensibility.core": { "type": "Transitive", "resolved": "2.9.3", @@ -414,6 +461,12 @@ "requested": "[13.0.2, )", "resolved": "13.0.2", "contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA==" + }, + "xunit.assert": { + "type": "CentralTransitive", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA==" } } } diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs index 4f81fd93..615d1a4b 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs @@ -5,7 +5,7 @@ using GraphQL.Client.Http; using Speckle.Newtonsoft.Json; using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; -using Xunit; + namespace Speckle.Sdk.Tests.Integration.Api.GraphQL; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs index f4f99370..9c5555ac 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs @@ -2,7 +2,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; + namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs index 80611b01..e2ca2267 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs @@ -4,7 +4,7 @@ using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; using Speckle.Sdk.Common; -using Xunit; + using Version = Speckle.Sdk.Api.GraphQL.Models.Version; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs index 91c995fd..d716e0df 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs @@ -4,7 +4,7 @@ using Speckle.Sdk.Api.GraphQL.Enums; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; + namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs index 19051efb..82e2db56 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs @@ -3,7 +3,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; + namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs index 86e41c71..ba4f3bab 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs @@ -2,7 +2,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Resources; using Speckle.Sdk.Credentials; -using Xunit; + namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs index 23137093..2426e240 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs @@ -3,7 +3,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; + namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs index 0a4efd57..3134035d 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs @@ -4,7 +4,7 @@ using Speckle.Sdk.Api.GraphQL; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Common; -using Xunit; + namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs index 2fd429b3..1d54fecd 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs @@ -6,7 +6,7 @@ using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; using Speckle.Sdk.Common; -using Xunit; + namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs index 98cee1fe..56dcd407 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs @@ -4,7 +4,7 @@ using Speckle.Sdk.Api.GraphQL.Enums; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; + namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs index 9abe9cce..05d881d9 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs @@ -4,7 +4,7 @@ using Speckle.Sdk.Api.GraphQL.Enums; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; + using Version = Speckle.Sdk.Api.GraphQL.Models.Version; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs index 321fdd2a..3160866f 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs @@ -3,7 +3,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; + using Version = Speckle.Sdk.Api.GraphQL.Models.Version; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs b/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs index 43a93be8..25673bde 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs @@ -3,7 +3,7 @@ using GraphQL.Client.Http; using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; -using Xunit; + namespace Speckle.Sdk.Tests.Integration.Credentials; diff --git a/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs b/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs index 99ccf856..dcf7985e 100644 --- a/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs @@ -5,7 +5,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Integration; diff --git a/tests/Speckle.Sdk.Tests.Integration/packages.lock.json b/tests/Speckle.Sdk.Tests.Integration/packages.lock.json index be0544e4..df3c8e42 100644 --- a/tests/Speckle.Sdk.Tests.Integration/packages.lock.json +++ b/tests/Speckle.Sdk.Tests.Integration/packages.lock.json @@ -63,6 +63,38 @@ "resolved": "3.0.2", "contentHash": "oXbusR6iPq0xlqoikjdLvzh+wQDkMv9If58myz9MEzldS4nIcp442Btgs2sWbYWV+caEluMe2pQCZ0hUZgPiow==" }, + "Argon": { + "type": "Transitive", + "resolved": "0.26.0", + "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "DiffEngine": { + "type": "Transitive", + "resolved": "15.9.0", + "contentHash": "shE6+tO4w5BmQTX0z+WnUV4UfmPNn6oTqBINbkts6OP0Icyx5WROSDzjjb95EwVYC4IAS+PxxS4Vbapxz4hkdw==", + "dependencies": { + "EmptyFiles": "8.7.1", + "System.Management": "9.0.1" + } + }, + "EmptyFiles": { + "type": "Transitive", + "resolved": "8.7.1", + "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw==" + }, + "FSharp.Core": { + "type": "Transitive", + "resolved": "7.0.300", + "contentHash": "8vvItREJ1l5lcp3vBCSJ1mFevVAhR48I34DuF/EoUa7o1KlFpQpagyuZkVYMAsHPIjdp47ZxM9sI4eqeXaeWkA==" + }, "GraphQL.Client.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -177,6 +209,20 @@ "resolved": "13.0.1", "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" }, + "Quibble": { + "type": "Transitive", + "resolved": "0.3.1", + "contentHash": "LD6bz2p+4O/BQnmD4mqFZrmdN/IjsPo1wUvfmcH46Q05ng+dyMLl3d2ylj0x412F4fpJEtm0Z3EaCAx4FqgNuQ==", + "dependencies": { + "FSharp.Core": "7.0.300", + "System.Text.Json": "7.0.3" + } + }, + "SimpleInfoName": { + "type": "Transitive", + "resolved": "3.1.0", + "contentHash": "j+ENh86NhxrgDc6T1ueqIR2QOdDkSJY2dbTFyPN/JvIXifB4GHAunlMw/x7P6m7XaXEHr3s+SMZfKBlmnmkO6g==" + }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", "resolved": "2.1.4", @@ -207,11 +253,34 @@ "SQLitePCLRaw.core": "2.1.4" } }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "2J5uq+2smnj+u1jlyVJ6BGGqaK9fHcK/EwN7mbsuPqTI6dZr86br8Cg6o/5B+icQ9ANTvTDpJjnhDNtYYZijHQ==" + }, "System.ComponentModel.Annotations": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "jY+E/PElNWQiazN0YHqZGvcSedcZ4Wt0Os1nnJ2SzR3gWZlhNRDkSXOhuHJcLuImD8SrJQQ8TfU0W4mVcit2hg==" + }, + "System.Management": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "CLEo9O6FuO4GQ3ZQkGssg9CJ2w2TN7GMFf3wHTc7YVWJV4xoyJRPw+XIDQnCcSUJCrHhrAWOO60cAX29EV5LFQ==", + "dependencies": { + "System.CodeDom": "9.0.1" + } + }, "System.Memory": { "type": "Transitive", "resolved": "4.5.3", @@ -232,6 +301,30 @@ "resolved": "4.5.1", "contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==" }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.4", + "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "Verify": { + "type": "Transitive", + "resolved": "28.10.1", + "contentHash": "2B/VtFN5jtF5g28kaM4GdJZTwb3pisd4+wL2NEPi9ZYe2lghWsCzS30V6LF1ILApLBfAorAstkU/Vw3sDWRqrg==", + "dependencies": { + "Argon": "0.26.0", + "DiffEngine": "15.9.0", + "SimpleInfoName": "3.1.0", + "System.IO.Hashing": "9.0.1" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -283,16 +376,29 @@ "speckle.sdk.dependencies": { "type": "Project" }, + "speckle.sdk.testing": { + "type": "Project", + "dependencies": { + "Microsoft.NET.Test.Sdk": "[17.13.0, )", + "Moq": "[4.20.70, )", + "Speckle.Sdk": "[1.0.0, )", + "Verify.Quibble": "[2.1.1, )", + "Verify.Xunit": "[28.10.1, )", + "xunit": "[2.9.3, )", + "xunit.runner.visualstudio": "[3.0.2, )" + } + }, "speckle.sdk.tests.unit": { "type": "Project", "dependencies": { "AwesomeAssertions": "[8.0.0, )", "Microsoft.Extensions.DependencyInjection": "[2.2.0, )", "Microsoft.NET.Test.Sdk": "[17.13.0, )", + "RichardSzalay.MockHttp": "[7.0.0, )", "Speckle.DoubleNumerics": "[4.1.0, )", "Speckle.Sdk": "[1.0.0, )", + "Speckle.Sdk.Testing": "[1.0.0, )", "altcover": "[9.0.1, )", - "xunit": "[2.9.3, )", "xunit.runner.visualstudio": "[3.0.2, )" } }, @@ -356,6 +462,21 @@ "Microsoft.Extensions.Options": "2.2.0" } }, + "Moq": { + "type": "CentralTransitive", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "RichardSzalay.MockHttp": { + "type": "CentralTransitive", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "QwnauYiaywp65QKFnP+wvgiQ2D8Pv888qB2dyfd7MSVDF06sIvxqASenk+RxsWybyyt+Hu1Y251wQxpHTv3UYg==" + }, "Speckle.DoubleNumerics": { "type": "CentralTransitive", "requested": "[4.1.0, )", @@ -368,6 +489,32 @@ "resolved": "13.0.2", "contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA==" }, + "Verify.Quibble": { + "type": "CentralTransitive", + "requested": "[2.1.1, )", + "resolved": "2.1.1", + "contentHash": "Z8bVwFICa3Dog6Mcnx0wlrn4Y+CFpQXx1f+ijfLn6/v4q00q+jLm9Gu/nVyUFuc75cjn6ieI08UrqXKcR9fTYw==", + "dependencies": { + "Quibble": "0.3.1", + "System.Text.Json": "8.0.4", + "Verify": "26.1.1" + } + }, + "Verify.Xunit": { + "type": "CentralTransitive", + "requested": "[28.10.1, )", + "resolved": "28.10.1", + "contentHash": "mkG7agMlx8oAEGcHoRY72hyDyNTdLIrzbfmniXFQgQ3yKulAHSYvYc9quzhpg0Sy+jb3svbdLqnRSg0VRhet3A==", + "dependencies": { + "Argon": "0.26.0", + "DiffEngine": "15.9.0", + "SimpleInfoName": "3.1.0", + "System.IO.Hashing": "9.0.1", + "Verify": "28.10.1", + "xunit.abstractions": "2.0.3", + "xunit.extensibility.execution": "2.9.3" + } + }, "xunit.assert": { "type": "CentralTransitive", "requested": "[2.9.3, )", diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs b/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs index af764b5d..61f7c178 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Api; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs new file mode 100644 index 00000000..99856f4a --- /dev/null +++ b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs @@ -0,0 +1,6 @@ +namespace Speckle.Sdk.Tests.Unit.Api.GraphQL; + +public class Client +{ + +} diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs index 3a06614f..a2d12392 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs @@ -2,7 +2,7 @@ using GraphQL; using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Api; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs index 1240254e..851a0b05 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs @@ -7,7 +7,7 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs index 1079ef52..a2f04e3a 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs @@ -1,5 +1,5 @@ using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs index 8df3a466..9feb8ab9 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs @@ -4,7 +4,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs index 3e402fc8..00e4fa36 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs @@ -4,7 +4,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs index 813d9307..fa8fb2be 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs @@ -6,7 +6,7 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs index b5dc30fe..a2875e26 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs @@ -5,7 +5,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; -using Xunit; + using Point = Speckle.Sdk.Tests.Unit.Host.Point; namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Assembly.cs b/tests/Speckle.Sdk.Tests.Unit/Assembly.cs index a4bcec54..94b51a96 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Assembly.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Assembly.cs @@ -1,3 +1,3 @@ -using Xunit; + [assembly: CollectionBehavior(DisableTestParallelization = true)] diff --git a/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs b/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs index a9ac02d5..4f90761c 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs @@ -1,6 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Common; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Common; diff --git a/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs b/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs index 575277bd..08469baa 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs @@ -1,5 +1,5 @@ using Speckle.Sdk.Dependencies; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Common; diff --git a/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs b/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs index 3f8caa7c..dad4e3dd 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs @@ -1,6 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Common; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Common; diff --git a/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs index b61eae75..6b9fe2eb 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs @@ -2,7 +2,7 @@ using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Credentials; diff --git a/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs b/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs index ac9df5f0..318d298d 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs @@ -2,7 +2,7 @@ using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Credentials; diff --git a/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs b/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs index 422dcbbe..54335b2d 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs @@ -1,7 +1,7 @@ using System.Runtime.InteropServices; using FluentAssertions; using Speckle.Sdk.Logging; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Helpers; diff --git a/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttp.cs b/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttp.cs new file mode 100644 index 00000000..052f052a --- /dev/null +++ b/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttp.cs @@ -0,0 +1,21 @@ +using Microsoft.Extensions.Logging; +using Moq; +using RichardSzalay.MockHttp; +using Speckle.Sdk.Helpers; +using Speckle.Sdk.Testing; + +namespace Speckle.Sdk.Tests.Unit.Helpers; + +public class SpeckleHttpTests : MoqTest +{ + [Fact] + public async Task HttpPing() + { + using var mockHttp = new MockHttpMessageHandler(); + var speckleHttp = new SpeckleHttp(Create>(MockBehavior.Loose).Object, + Create().Object); + + var uri = new Uri("https://speckle.xyz"); + var response = await speckleHttp.HttpPing(uri, mockHttp.ToHttpClient()); + } +} diff --git a/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs index 87d5aa3c..193c6f1e 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs @@ -1,6 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Host; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Host; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs index c658b48a..66112a51 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs @@ -2,7 +2,7 @@ using FluentAssertions; using Speckle.Sdk.Common; using Speckle.Sdk.Host; using Speckle.Sdk.Models; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Models; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs index f0a24de5..81a2e3be 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs @@ -3,7 +3,7 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Models.Collections; using Speckle.Sdk.Models.Extensions; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Models.Extensions; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs index b000afcc..1076c4fd 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs @@ -2,7 +2,7 @@ using FluentAssertions; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Models.Extensions; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Models.Extensions; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs index 4b5c3750..edacbdbd 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs @@ -1,6 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Models.Extensions; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Models.Extensions; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs index 945102a4..8b459734 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs @@ -3,7 +3,7 @@ using FluentAssertions; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Models.GraphTraversal; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Models.GraphTraversal; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs index d8c6f072..40f4ef24 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs @@ -3,7 +3,7 @@ using Speckle.Sdk.Common; using Speckle.Sdk.Models; using Speckle.Sdk.Models.Collections; using Speckle.Sdk.Models.GraphTraversal; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Models.GraphTraversal; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs index decd2b33..cb8ed2e5 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs @@ -3,7 +3,7 @@ using FluentAssertions; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Models; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs b/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs index 63500570..c68f6042 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs @@ -2,7 +2,7 @@ using FluentAssertions; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Models.TestModels; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Models { diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs index da0c804b..26011177 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs @@ -2,7 +2,7 @@ using FluentAssertions; using Speckle.Sdk.Common; using Speckle.Sdk.Models; using Speckle.Sdk.Models.Extensions; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Models; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs index 72f71821..8b326ae0 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs @@ -1,7 +1,7 @@ using FluentAssertions; using Speckle.Sdk.Dependencies; using Speckle.Sdk.Helpers; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Models; diff --git a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs index 49c2a549..eec30203 100644 --- a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs @@ -1,6 +1,6 @@ using FluentAssertions; using Speckle.Sdk.SQLite; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.SQLite; diff --git a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs index 91721a95..cde49e2e 100644 --- a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs @@ -1,6 +1,6 @@ using Microsoft.Data.Sqlite; using Speckle.Sdk.SQLite; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.SQLite; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs index de6f38a0..478c7691 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs @@ -1,7 +1,7 @@ using FluentAssertions; using Speckle.Sdk.Dependencies; using Speckle.Sdk.Serialisation.V2.Send; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs index 7eb55588..267a6b54 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs @@ -4,7 +4,7 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs index 2b03a901..146ff8a9 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs @@ -5,7 +5,7 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs index eae0825c..37acbdba 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs @@ -2,7 +2,7 @@ using FluentAssertions; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation.Deprecated; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Serialisation { diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs index a2510abe..2fe40605 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs @@ -5,7 +5,7 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Tests.Unit.Host; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs index 42397f93..c6d2c8e0 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs @@ -5,7 +5,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; -using Xunit; + using Matrix4x4 = Speckle.DoubleNumerics.Matrix4x4; namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs index dc6e8cb2..3c95e4bc 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs @@ -5,7 +5,7 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Speckle.Sdk.Tests.Unit.csproj b/tests/Speckle.Sdk.Tests.Unit/Speckle.Sdk.Tests.Unit.csproj index 5449b7dc..92ef4b7c 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Speckle.Sdk.Tests.Unit.csproj +++ b/tests/Speckle.Sdk.Tests.Unit/Speckle.Sdk.Tests.Unit.csproj @@ -10,14 +10,15 @@ + - + diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs index d903a902..f4ace5b3 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs @@ -1,7 +1,7 @@ using FluentAssertions; using Speckle.Sdk.Common; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Transports; diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs index e457c1a7..666e61ac 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs @@ -3,7 +3,7 @@ using FluentAssertions; using Speckle.Sdk.Common; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Transports; diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs index e4d20cf4..26753e6e 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs @@ -3,7 +3,7 @@ using Microsoft.Data.Sqlite; using Speckle.Sdk.Common; using Speckle.Sdk.Serialisation.Utilities; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Transports; diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs index 1a385466..c5144ff9 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs @@ -1,7 +1,7 @@ using FluentAssertions; using Microsoft.Data.Sqlite; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Transports; diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs index 2aa32fdf..a068501c 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs @@ -2,7 +2,7 @@ using FluentAssertions; using Speckle.Newtonsoft.Json; using Speckle.Sdk.Common; using Speckle.Sdk.Transports; -using Xunit; + namespace Speckle.Sdk.Tests.Unit.Transports; diff --git a/tests/Speckle.Sdk.Tests.Unit/packages.lock.json b/tests/Speckle.Sdk.Tests.Unit/packages.lock.json index 09c4e740..88527280 100644 --- a/tests/Speckle.Sdk.Tests.Unit/packages.lock.json +++ b/tests/Speckle.Sdk.Tests.Unit/packages.lock.json @@ -55,6 +55,12 @@ "resolved": "1.15.0", "contentHash": "FbU0El+EEjdpuIX4iDbeS7ki1uzpJPx8vbqOzEtqnl1GZeAGJfq+jCbxeJL2y0EPnUNk8dRnnqR2xnYXg9Tf+g==" }, + "RichardSzalay.MockHttp": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "QwnauYiaywp65QKFnP+wvgiQ2D8Pv888qB2dyfd7MSVDF06sIvxqASenk+RxsWybyyt+Hu1Y251wQxpHTv3UYg==" + }, "Speckle.DoubleNumerics": { "type": "Direct", "requested": "[4.1.0, )", @@ -67,23 +73,44 @@ "resolved": "0.9.6", "contentHash": "HKH7tYrYYlCK1ct483hgxERAdVdMtl7gUKW9ijWXxA1UsYR4Z+TrRHYmzZ9qmpu1NnTycSrp005NYM78GDKV1w==" }, - "xunit": { - "type": "Direct", - "requested": "[2.9.3, )", - "resolved": "2.9.3", - "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", - "dependencies": { - "xunit.analyzers": "1.18.0", - "xunit.assert": "2.9.3", - "xunit.core": "[2.9.3]" - } - }, "xunit.runner.visualstudio": { "type": "Direct", "requested": "[3.0.2, )", "resolved": "3.0.2", "contentHash": "oXbusR6iPq0xlqoikjdLvzh+wQDkMv9If58myz9MEzldS4nIcp442Btgs2sWbYWV+caEluMe2pQCZ0hUZgPiow==" }, + "Argon": { + "type": "Transitive", + "resolved": "0.26.0", + "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "DiffEngine": { + "type": "Transitive", + "resolved": "15.9.0", + "contentHash": "shE6+tO4w5BmQTX0z+WnUV4UfmPNn6oTqBINbkts6OP0Icyx5WROSDzjjb95EwVYC4IAS+PxxS4Vbapxz4hkdw==", + "dependencies": { + "EmptyFiles": "8.7.1", + "System.Management": "9.0.1" + } + }, + "EmptyFiles": { + "type": "Transitive", + "resolved": "8.7.1", + "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw==" + }, + "FSharp.Core": { + "type": "Transitive", + "resolved": "7.0.300", + "contentHash": "8vvItREJ1l5lcp3vBCSJ1mFevVAhR48I34DuF/EoUa7o1KlFpQpagyuZkVYMAsHPIjdp47ZxM9sI4eqeXaeWkA==" + }, "GraphQL.Client.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -198,6 +225,20 @@ "resolved": "13.0.1", "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" }, + "Quibble": { + "type": "Transitive", + "resolved": "0.3.1", + "contentHash": "LD6bz2p+4O/BQnmD4mqFZrmdN/IjsPo1wUvfmcH46Q05ng+dyMLl3d2ylj0x412F4fpJEtm0Z3EaCAx4FqgNuQ==", + "dependencies": { + "FSharp.Core": "7.0.300", + "System.Text.Json": "7.0.3" + } + }, + "SimpleInfoName": { + "type": "Transitive", + "resolved": "3.1.0", + "contentHash": "j+ENh86NhxrgDc6T1ueqIR2QOdDkSJY2dbTFyPN/JvIXifB4GHAunlMw/x7P6m7XaXEHr3s+SMZfKBlmnmkO6g==" + }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", "resolved": "2.1.4", @@ -228,11 +269,34 @@ "SQLitePCLRaw.core": "2.1.4" } }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "2J5uq+2smnj+u1jlyVJ6BGGqaK9fHcK/EwN7mbsuPqTI6dZr86br8Cg6o/5B+icQ9ANTvTDpJjnhDNtYYZijHQ==" + }, "System.ComponentModel.Annotations": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "jY+E/PElNWQiazN0YHqZGvcSedcZ4Wt0Os1nnJ2SzR3gWZlhNRDkSXOhuHJcLuImD8SrJQQ8TfU0W4mVcit2hg==" + }, + "System.Management": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "CLEo9O6FuO4GQ3ZQkGssg9CJ2w2TN7GMFf3wHTc7YVWJV4xoyJRPw+XIDQnCcSUJCrHhrAWOO60cAX29EV5LFQ==", + "dependencies": { + "System.CodeDom": "9.0.1" + } + }, "System.Memory": { "type": "Transitive", "resolved": "4.5.3", @@ -253,6 +317,30 @@ "resolved": "4.5.1", "contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==" }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.4", + "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "Verify": { + "type": "Transitive", + "resolved": "28.10.1", + "contentHash": "2B/VtFN5jtF5g28kaM4GdJZTwb3pisd4+wL2NEPi9ZYe2lghWsCzS30V6LF1ILApLBfAorAstkU/Vw3sDWRqrg==", + "dependencies": { + "Argon": "0.26.0", + "DiffEngine": "15.9.0", + "SimpleInfoName": "3.1.0", + "System.IO.Hashing": "9.0.1" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -304,6 +392,18 @@ "speckle.sdk.dependencies": { "type": "Project" }, + "speckle.sdk.testing": { + "type": "Project", + "dependencies": { + "Microsoft.NET.Test.Sdk": "[17.13.0, )", + "Moq": "[4.20.70, )", + "Speckle.Sdk": "[1.0.0, )", + "Verify.Quibble": "[2.1.1, )", + "Verify.Xunit": "[28.10.1, )", + "xunit": "[2.9.3, )", + "xunit.runner.visualstudio": "[3.0.2, )" + } + }, "GraphQL.Client": { "type": "CentralTransitive", "requested": "[6.0.0, )", @@ -349,12 +449,58 @@ "Microsoft.Extensions.Options": "2.2.0" } }, + "Moq": { + "type": "CentralTransitive", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, "Speckle.Newtonsoft.Json": { "type": "CentralTransitive", "requested": "[13.0.2, )", "resolved": "13.0.2", "contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA==" }, + "Verify.Quibble": { + "type": "CentralTransitive", + "requested": "[2.1.1, )", + "resolved": "2.1.1", + "contentHash": "Z8bVwFICa3Dog6Mcnx0wlrn4Y+CFpQXx1f+ijfLn6/v4q00q+jLm9Gu/nVyUFuc75cjn6ieI08UrqXKcR9fTYw==", + "dependencies": { + "Quibble": "0.3.1", + "System.Text.Json": "8.0.4", + "Verify": "26.1.1" + } + }, + "Verify.Xunit": { + "type": "CentralTransitive", + "requested": "[28.10.1, )", + "resolved": "28.10.1", + "contentHash": "mkG7agMlx8oAEGcHoRY72hyDyNTdLIrzbfmniXFQgQ3yKulAHSYvYc9quzhpg0Sy+jb3svbdLqnRSg0VRhet3A==", + "dependencies": { + "Argon": "0.26.0", + "DiffEngine": "15.9.0", + "SimpleInfoName": "3.1.0", + "System.IO.Hashing": "9.0.1", + "Verify": "28.10.1", + "xunit.abstractions": "2.0.3", + "xunit.extensibility.execution": "2.9.3" + } + }, + "xunit": { + "type": "CentralTransitive", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "dependencies": { + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" + } + }, "xunit.assert": { "type": "CentralTransitive", "requested": "[2.9.3, )", From 3291010d435b82cc4523db0eb624e7d375499501 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Fri, 7 Mar 2025 09:09:25 +0000 Subject: [PATCH 20/37] add SpeckleHttpTests --- src/Speckle.Sdk/Helpers/SpeckleHttp.cs | 2 +- .../ServerObjectManagerTests.cs | 4 +- .../GraphQL/GraphQLClientExceptionHandling.cs | 1 - .../Resources/ActiveUserResourceTests.cs | 1 - .../GraphQL/Resources/CommentResourceTests.cs | 1 - .../ModelResourceExceptionalTests.cs | 1 - .../GraphQL/Resources/ModelResourceTests.cs | 1 - .../Resources/OtherUserResourceTests.cs | 1 - .../ProjectInviteResourceExceptionalTests.cs | 1 - .../Resources/ProjectInviteResourceTests.cs | 1 - .../ProjectResourceExceptionalTests.cs | 1 - .../GraphQL/Resources/ProjectResourceTests.cs | 1 - .../Resources/SubscriptionResourceTests.cs | 1 - .../GraphQL/Resources/VersionResourceTests.cs | 1 - .../Credentials/UserServerInfoTests.cs | 1 - .../MemoryTransportTests.cs | 1 - .../Api/ClientResiliencyPolicyTest.cs | 1 - .../Api/GraphQL/Client.cs | 5 +-- .../Api/GraphQLErrorHandler.cs | 1 - .../Api/Operations/ClosureTests.cs | 1 - .../OperationsReceiveTests.Exceptional.cs | 1 - .../Api/Operations/OperationsReceiveTests.cs | 1 - .../Api/Operations/SendObjectReferences.cs | 1 - .../Api/Operations/SendReceiveLocal.cs | 1 - .../Api/Operations/SerializationTests.cs | 1 - tests/Speckle.Sdk.Tests.Unit/Assembly.cs | 4 +- .../Common/NotNullTests.cs | 1 - .../Common/RangeFromTests.cs | 1 - .../Common/UnitsTest.cs | 1 - .../AccountServerMigrationTests.cs | 1 - .../Credentials/Accounts.cs | 1 - tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs | 1 - .../Helpers/SpeckleHttp.cs | 21 ---------- .../Helpers/SpeckleHttpTests.cs | 42 +++++++++++++++++++ .../Host/HostApplicationTests.cs | 1 - .../Models/BaseTests.cs | 1 - .../Models/Extensions/BaseExtensionsTests.cs | 1 - .../Models/Extensions/DisplayValueTests.cs | 1 - .../Models/Extensions/ExceptionTests.cs | 1 - .../GraphTraversal/GraphTraversalTests.cs | 1 - .../TraversalContextExtensionsTests.cs | 1 - .../Speckle.Sdk.Tests.Unit/Models/Hashing.cs | 1 - .../Models/SpeckleType.cs | 1 - .../Models/TraversalTests.cs | 1 - .../Models/UtilitiesTests.cs | 1 - .../SQLite/SQLiteJsonCacheManagerTests.cs | 1 - .../SQLite/SQLiteJsonExceptionTests.cs | 1 - .../Serialisation/BatchTests.cs | 1 - .../Serialisation/ChunkingTests.cs | 1 - .../Serialisation/JsonIgnoreAttributeTests.cs | 1 - .../ObjectModelDeprecationTests.cs | 1 - .../SerializerBreakingChanges.cs | 1 - .../SerializerNonBreakingChanges.cs | 1 - .../Serialisation/SimpleRoundTripTests.cs | 1 - .../Transports/DiskTransportTests.cs | 1 - .../Transports/MemoryTransportTests.cs | 1 - .../Transports/SQLiteTransport2Tests.cs | 1 - .../Transports/SQLiteTransportTests.cs | 1 - .../Transports/TransportTests.cs | 1 - 59 files changed, 46 insertions(+), 85 deletions(-) delete mode 100644 tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttp.cs create mode 100644 tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs diff --git a/src/Speckle.Sdk/Helpers/SpeckleHttp.cs b/src/Speckle.Sdk/Helpers/SpeckleHttp.cs index 425e4559..3cea1aa6 100644 --- a/src/Speckle.Sdk/Helpers/SpeckleHttp.cs +++ b/src/Speckle.Sdk/Helpers/SpeckleHttp.cs @@ -19,7 +19,7 @@ public class SpeckleHttp(ILogger logger, ISpeckleHttpClientHandlerF using var httpClient = CreateHttpClient(); return await HttpPing(uri, httpClient).ConfigureAwait(false); } - + public async Task HttpPing(Uri uri, HttpClient httpClient) { try diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs index 89a4d831..5106d5b6 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs @@ -1,5 +1,4 @@ -using System.Diagnostics.CodeAnalysis; -using System.Net; +using System.Net; using System.Text; using FluentAssertions; using HttpMultipartParser; @@ -17,7 +16,6 @@ using Speckle.Sdk.Testing; namespace Speckle.Sdk.Serialization.Tests; - public class ServerObjectManagerTests : MoqTest { [Fact] diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs index 615d1a4b..4723201a 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs @@ -6,7 +6,6 @@ using Speckle.Newtonsoft.Json; using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; - namespace Speckle.Sdk.Tests.Integration.Api.GraphQL; public class GraphQLClientExceptionHandling : IAsyncLifetime diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs index 9c5555ac..4d20589b 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Resources; - namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ActiveUserResourceTests : IAsyncLifetime diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs index e2ca2267..1f350f33 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; using Speckle.Sdk.Common; - using Version = Speckle.Sdk.Api.GraphQL.Models.Version; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs index d716e0df..d2e8fcde 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; - namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ModelResourceExceptionalTests : IAsyncLifetime diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs index 82e2db56..57220eee 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; - namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ModelResourceTests : IAsyncLifetime diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs index ba4f3bab..ad5e7482 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Resources; using Speckle.Sdk.Credentials; - namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class OtherUserResourceTests diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs index 2426e240..8c8d6aef 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; - namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ProjectInviteResourceExceptionalTests : IAsyncLifetime diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs index 3134035d..5ff4700c 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Common; - namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ProjectInviteResourceTests : IAsyncLifetime diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs index 1d54fecd..0ee4201e 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs @@ -7,7 +7,6 @@ using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; using Speckle.Sdk.Common; - namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ProjectResourceExceptionalTests : IAsyncLifetime diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs index 56dcd407..05688815 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; - namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ProjectResourceTests diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs index 05d881d9..de538053 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api.GraphQL.Enums; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; - using Version = Speckle.Sdk.Api.GraphQL.Models.Version; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs index 3160866f..ce97649c 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; - using Version = Speckle.Sdk.Api.GraphQL.Models.Version; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs b/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs index 25673bde..dad46fb6 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs @@ -4,7 +4,6 @@ using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; - namespace Speckle.Sdk.Tests.Integration.Credentials; public class UserServerInfoTests : IAsyncLifetime diff --git a/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs b/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs index dcf7985e..f1c7cc8b 100644 --- a/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs @@ -6,7 +6,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Integration; public class MemoryTransportTests : IDisposable diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs b/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs index 61f7c178..9c2b3e37 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; - namespace Speckle.Sdk.Tests.Unit.Api; public sealed class GraphQLClientTests : IDisposable diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs index 99856f4a..a02b9ce5 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs @@ -1,6 +1,3 @@ namespace Speckle.Sdk.Tests.Unit.Api.GraphQL; -public class Client -{ - -} +public class Client { } diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs index a2d12392..a41f8c10 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs @@ -3,7 +3,6 @@ using GraphQL; using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL; - namespace Speckle.Sdk.Tests.Unit.Api; public class GraphQLErrorHandlerTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs index 851a0b05..1397a9ec 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs @@ -8,7 +8,6 @@ using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Api.Operations; public class Closures diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs index a2f04e3a..00288a36 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs @@ -1,6 +1,5 @@ using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Api.Operations; public partial class OperationsReceiveTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs index 9feb8ab9..8ca3a9a9 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Api.Operations; public sealed partial class OperationsReceiveTests : IDisposable diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs index 00e4fa36..94704b0c 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Api.Operations; public class SendObjectReferences diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs index fa8fb2be..ab85188d 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs @@ -7,7 +7,6 @@ using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Api.Operations; public sealed class SendReceiveLocal : IDisposable diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs index a2875e26..b119382d 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; - using Point = Speckle.Sdk.Tests.Unit.Host.Point; namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Assembly.cs b/tests/Speckle.Sdk.Tests.Unit/Assembly.cs index 94b51a96..c7fc3b1f 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Assembly.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Assembly.cs @@ -1,3 +1 @@ - - -[assembly: CollectionBehavior(DisableTestParallelization = true)] +[assembly: CollectionBehavior(DisableTestParallelization = true)] diff --git a/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs b/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs index 4f90761c..3dc8f2ce 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs @@ -1,7 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Common; - namespace Speckle.Sdk.Tests.Unit.Common; public class NotNullTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs b/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs index 08469baa..05be88c9 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs @@ -1,6 +1,5 @@ using Speckle.Sdk.Dependencies; - namespace Speckle.Sdk.Tests.Unit.Common; public class RangeFromTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs b/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs index dad4e3dd..538a4b87 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs @@ -1,7 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Common; - namespace Speckle.Sdk.Tests.Unit.Common; public class UnitsTest diff --git a/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs index 6b9fe2eb..ccf8a553 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs @@ -3,7 +3,6 @@ using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; - namespace Speckle.Sdk.Tests.Unit.Credentials; public class AccountServerMigrationTests : IDisposable diff --git a/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs b/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs index 318d298d..ad18d9d2 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs @@ -3,7 +3,6 @@ using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; - namespace Speckle.Sdk.Tests.Unit.Credentials; public class CredentialInfrastructure : IDisposable diff --git a/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs b/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs index 54335b2d..73280f59 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs @@ -2,7 +2,6 @@ using System.Runtime.InteropServices; using FluentAssertions; using Speckle.Sdk.Logging; - namespace Speckle.Sdk.Tests.Unit.Helpers; public class SpecklePathTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttp.cs b/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttp.cs deleted file mode 100644 index 052f052a..00000000 --- a/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttp.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Microsoft.Extensions.Logging; -using Moq; -using RichardSzalay.MockHttp; -using Speckle.Sdk.Helpers; -using Speckle.Sdk.Testing; - -namespace Speckle.Sdk.Tests.Unit.Helpers; - -public class SpeckleHttpTests : MoqTest -{ - [Fact] - public async Task HttpPing() - { - using var mockHttp = new MockHttpMessageHandler(); - var speckleHttp = new SpeckleHttp(Create>(MockBehavior.Loose).Object, - Create().Object); - - var uri = new Uri("https://speckle.xyz"); - var response = await speckleHttp.HttpPing(uri, mockHttp.ToHttpClient()); - } -} diff --git a/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs b/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs new file mode 100644 index 00000000..b8cc97e1 --- /dev/null +++ b/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs @@ -0,0 +1,42 @@ +using System.Net; +using Microsoft.Extensions.Logging; +using Moq; +using RichardSzalay.MockHttp; +using Speckle.Sdk.Helpers; +using Speckle.Sdk.Testing; + +namespace Speckle.Sdk.Tests.Unit.Helpers; + +public class SpeckleHttpTests : MoqTest +{ + [Fact] + public async Task HttpPing() + { + using var mockHttp = new MockHttpMessageHandler(); + var speckleHttp = new SpeckleHttp( + Create>(MockBehavior.Loose).Object, + Create().Object + ); + + var uri = new Uri("https://speckle.xyz"); + mockHttp.When(uri.AbsoluteUri).Respond("application/json", "{}"); + var response = await speckleHttp.HttpPing(uri, mockHttp.ToHttpClient()); + Assert.NotNull(response); + } + + [Fact] + public async Task HttpPing_Failed() + { + using var mockHttp = new MockHttpMessageHandler(); + var speckleHttp = new SpeckleHttp( + Create>(MockBehavior.Loose).Object, + Create().Object + ); + + var uri = new Uri("https://speckle.xyz"); + mockHttp.When(uri.AbsoluteUri).Respond(HttpStatusCode.Unauthorized); + await Assert.ThrowsAsync( + async () => await speckleHttp.HttpPing(uri, mockHttp.ToHttpClient()) + ); + } +} diff --git a/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs index 193c6f1e..288f5656 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs @@ -1,7 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Host; - namespace Speckle.Sdk.Tests.Unit.Host; public class HostApplicationTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs index 66112a51..36dea4e9 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Common; using Speckle.Sdk.Host; using Speckle.Sdk.Models; - namespace Speckle.Sdk.Tests.Unit.Models; public class BaseTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs index 81a2e3be..462d56ba 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Models; using Speckle.Sdk.Models.Collections; using Speckle.Sdk.Models.Extensions; - namespace Speckle.Sdk.Tests.Unit.Models.Extensions; public class BaseExtensionsTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs index 1076c4fd..a66c3f64 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Models.Extensions; - namespace Speckle.Sdk.Tests.Unit.Models.Extensions; public class DisplayValueTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs index edacbdbd..317080a1 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs @@ -1,7 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Models.Extensions; - namespace Speckle.Sdk.Tests.Unit.Models.Extensions; public class ExceptionTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs index 8b459734..5771daf3 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Models.GraphTraversal; - namespace Speckle.Sdk.Tests.Unit.Models.GraphTraversal; public class GraphTraversalTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs index 40f4ef24..f1841970 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Models; using Speckle.Sdk.Models.Collections; using Speckle.Sdk.Models.GraphTraversal; - namespace Speckle.Sdk.Tests.Unit.Models.GraphTraversal; // Mark test class for xUnit diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs index cb8ed2e5..9de09c2d 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; - namespace Speckle.Sdk.Tests.Unit.Models; // Removed [TestFixture] and [TestOf] annotations as they are NUnit specific diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs b/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs index c68f6042..b92de3c3 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Models.TestModels; - namespace Speckle.Sdk.Tests.Unit.Models { public class SpeckleTypeTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs index 26011177..ef705359 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Common; using Speckle.Sdk.Models; using Speckle.Sdk.Models.Extensions; - namespace Speckle.Sdk.Tests.Unit.Models; public class TraversalTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs index 8b326ae0..32bf1d17 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs @@ -2,7 +2,6 @@ using Speckle.Sdk.Dependencies; using Speckle.Sdk.Helpers; - namespace Speckle.Sdk.Tests.Unit.Models; public sealed class HashUtilityTests diff --git a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs index eec30203..6496451e 100644 --- a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs @@ -1,7 +1,6 @@ using FluentAssertions; using Speckle.Sdk.SQLite; - namespace Speckle.Sdk.Tests.Unit.SQLite; public class SQLiteJsonCacheManagerTests : IDisposable diff --git a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs index cde49e2e..434aa223 100644 --- a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs @@ -1,7 +1,6 @@ using Microsoft.Data.Sqlite; using Speckle.Sdk.SQLite; - namespace Speckle.Sdk.Tests.Unit.SQLite; public class SqLiteJsonCacheExceptionTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs index 478c7691..018b4f30 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Speckle.Sdk.Dependencies; using Speckle.Sdk.Serialisation.V2.Send; - namespace Speckle.Sdk.Tests.Unit.Serialisation; public class BatchTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs index 267a6b54..3fa44af0 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Serialisation; public class ChunkingTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs index 146ff8a9..7861b723 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs @@ -6,7 +6,6 @@ using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Serialisation; /// diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs index 37acbdba..350651bd 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation.Deprecated; - namespace Speckle.Sdk.Tests.Unit.Serialisation { public class TypeLoaderTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs index 2fe40605..93eec8cf 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs @@ -6,7 +6,6 @@ using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Tests.Unit.Host; - namespace Speckle.Sdk.Tests.Unit.Serialisation; /// diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs index c6d2c8e0..ba7b231c 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; - using Matrix4x4 = Speckle.DoubleNumerics.Matrix4x4; namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs index 3c95e4bc..63c64a26 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs @@ -6,7 +6,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; - namespace Speckle.Sdk.Tests.Unit.Serialisation; public class SimpleRoundTripTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs index f4ace5b3..68e3d627 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Speckle.Sdk.Common; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Transports; public sealed class DiskTransportTests : TransportTests, IDisposable diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs index 666e61ac..a3567f69 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs @@ -4,7 +4,6 @@ using FluentAssertions; using Speckle.Sdk.Common; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Transports; public sealed class MemoryTransportTests : TransportTests diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs index 26753e6e..5b82d283 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Common; using Speckle.Sdk.Serialisation.Utilities; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Transports; public sealed class SQLiteTransport2Tests : TransportTests, IDisposable diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs index c5144ff9..9c759b6f 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Microsoft.Data.Sqlite; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Transports; public sealed class SQLiteTransportTests : TransportTests, IDisposable diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs index a068501c..4a409b1b 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs @@ -3,7 +3,6 @@ using Speckle.Newtonsoft.Json; using Speckle.Sdk.Common; using Speckle.Sdk.Transports; - namespace Speckle.Sdk.Tests.Unit.Transports; public abstract class TransportTests From 793bbb9cd3152bdc4780a160eb78187810f1ec36 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Fri, 7 Mar 2025 09:29:05 +0000 Subject: [PATCH 21/37] Complete speckle http --- .../SpeckleHttpClientHandler.cs | 2 +- .../SpeckleHttpClientHandlerFactory.cs | 9 +++++-- .../Helpers/SpeckleHttpTests.cs | 26 ++++++++++++++++++- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/Speckle.Sdk.Dependencies/SpeckleHttpClientHandler.cs b/src/Speckle.Sdk.Dependencies/SpeckleHttpClientHandler.cs index 2070de4e..7df830c5 100644 --- a/src/Speckle.Sdk.Dependencies/SpeckleHttpClientHandler.cs +++ b/src/Speckle.Sdk.Dependencies/SpeckleHttpClientHandler.cs @@ -3,7 +3,7 @@ using Speckle.Sdk.Logging; namespace Speckle.Sdk.Helpers; -public sealed class SpeckleHttpClientHandler : DelegatingHandler +internal sealed class SpeckleHttpClientHandler : DelegatingHandler { private readonly IAsyncPolicy _resiliencePolicy; private readonly ISdkActivityFactory _activityFactory; diff --git a/src/Speckle.Sdk.Dependencies/SpeckleHttpClientHandlerFactory.cs b/src/Speckle.Sdk.Dependencies/SpeckleHttpClientHandlerFactory.cs index 908e9a94..26e397df 100644 --- a/src/Speckle.Sdk.Dependencies/SpeckleHttpClientHandlerFactory.cs +++ b/src/Speckle.Sdk.Dependencies/SpeckleHttpClientHandlerFactory.cs @@ -40,8 +40,13 @@ public sealed class SpeckleHttpClientHandlerFactory(ISdkActivityFactory activity return Policy.WrapAsync(retryPolicy, timeoutPolicy); } - public SpeckleHttpClientHandler Create( + public DelegatingHandler Create( HttpMessageHandler? innerHandler = null, int timeoutSeconds = DEFAULT_TIMEOUT_SECONDS - ) => new(innerHandler ?? new HttpClientHandler(), activityFactory, HttpAsyncPolicy(timeoutSeconds: timeoutSeconds)); + ) => + new SpeckleHttpClientHandler( + innerHandler ?? new HttpClientHandler(), + activityFactory, + HttpAsyncPolicy(timeoutSeconds: timeoutSeconds) + ); } diff --git a/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs b/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs index b8cc97e1..2f17a696 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs @@ -1,4 +1,5 @@ using System.Net; +using FluentAssertions; using Microsoft.Extensions.Logging; using Moq; using RichardSzalay.MockHttp; @@ -21,7 +22,7 @@ public class SpeckleHttpTests : MoqTest var uri = new Uri("https://speckle.xyz"); mockHttp.When(uri.AbsoluteUri).Respond("application/json", "{}"); var response = await speckleHttp.HttpPing(uri, mockHttp.ToHttpClient()); - Assert.NotNull(response); + response.Should().NotBeNull(); } [Fact] @@ -39,4 +40,27 @@ public class SpeckleHttpTests : MoqTest async () => await speckleHttp.HttpPing(uri, mockHttp.ToHttpClient()) ); } + + [Fact] + public void CreateHttpClient_NoToken() + { + var clientHandlerFactory = Create(); + + using var mockHttp1 = new MockHttpMessageHandler(); + using var mockHttp2 = new MockHttpMessageHandler(); + var speckleHandler = Create(); + + clientHandlerFactory + .Setup(x => x.Create(mockHttp1, SpeckleHttp.DEFAULT_TIMEOUT_SECONDS)) + .Returns(speckleHandler.Object); + + var speckleHttp = new SpeckleHttp( + Create>(MockBehavior.Loose).Object, + clientHandlerFactory.Object + ); + + var client = speckleHttp.CreateHttpClient(mockHttp1); + client.Should().NotBeNull(); + client.DefaultRequestHeaders.Should().BeEmpty(); + } } From 15fa31943375de91dc4692085574e00d745c4132 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Fri, 7 Mar 2025 10:26:13 +0000 Subject: [PATCH 22/37] Show code coverage for dev (#243) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5a437272..b5cbd214 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Speckle | Sharp | SDK ### .NET SDK, Tests, and Objects -[![Codecov](https://codecov.io/gh/specklesystems/speckle-sharp-sdk/graph/badge.svg?token=TTM5OGr38m)](https://codecov.io/gh/specklesystems/speckle-sharp-sdk) +[![codecov](https://codecov.io/gh/specklesystems/speckle-sharp-sdk/branch/dev/graph/badge.svg?token=TTM5OGr38m)](https://codecov.io/gh/specklesystems/speckle-sharp-sdk) > [!WARNING] > This is an early beta release, not meant for use in production! We're working to stabilise the 3.0 API, and until then there will be breaking changes. You have been warned! From 9695ec8c515d12e2920b00a016cf1e896500fb65 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Fri, 7 Mar 2025 10:48:01 +0000 Subject: [PATCH 23/37] SpeckleHttp coverage (#244) * Show code coverage for dev * SpeckleHttp coverage and moved base stuff around * add SpeckleHttpTests --- .../Helpers/{Http.cs => SpeckleHttp.cs} | 7 +- .../packages.lock.json | 49 +++++ .../ServerObjectManagerTests.cs | 17 +- .../packages.lock.json | 27 +++ tests/Speckle.Sdk.Testing/MoqTest.cs | 17 ++ .../Speckle.Sdk.Testing.csproj | 2 + tests/Speckle.Sdk.Testing/packages.lock.json | 53 ++++++ .../GraphQL/GraphQLClientExceptionHandling.cs | 1 - .../Resources/ActiveUserResourceTests.cs | 1 - .../GraphQL/Resources/CommentResourceTests.cs | 1 - .../ModelResourceExceptionalTests.cs | 1 - .../GraphQL/Resources/ModelResourceTests.cs | 1 - .../Resources/OtherUserResourceTests.cs | 1 - .../ProjectInviteResourceExceptionalTests.cs | 1 - .../Resources/ProjectInviteResourceTests.cs | 1 - .../ProjectResourceExceptionalTests.cs | 1 - .../GraphQL/Resources/ProjectResourceTests.cs | 1 - .../Resources/SubscriptionResourceTests.cs | 1 - .../GraphQL/Resources/VersionResourceTests.cs | 1 - .../Credentials/UserServerInfoTests.cs | 1 - .../MemoryTransportTests.cs | 1 - .../packages.lock.json | 149 +++++++++++++++- .../Api/ClientResiliencyPolicyTest.cs | 1 - .../Api/GraphQL/Client.cs | 3 + .../Api/GraphQLErrorHandler.cs | 1 - .../Api/Operations/ClosureTests.cs | 1 - .../OperationsReceiveTests.Exceptional.cs | 1 - .../Api/Operations/OperationsReceiveTests.cs | 1 - .../Api/Operations/SendObjectReferences.cs | 1 - .../Api/Operations/SendReceiveLocal.cs | 1 - .../Api/Operations/SerializationTests.cs | 1 - tests/Speckle.Sdk.Tests.Unit/Assembly.cs | 4 +- .../Common/NotNullTests.cs | 1 - .../Common/RangeFromTests.cs | 1 - .../Common/UnitsTest.cs | 1 - .../AccountServerMigrationTests.cs | 1 - .../Credentials/Accounts.cs | 1 - tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs | 1 - .../Helpers/SpeckleHttpTests.cs | 42 +++++ .../Host/HostApplicationTests.cs | 1 - .../Models/BaseTests.cs | 1 - .../Models/Extensions/BaseExtensionsTests.cs | 1 - .../Models/Extensions/DisplayValueTests.cs | 1 - .../Models/Extensions/ExceptionTests.cs | 1 - .../GraphTraversal/GraphTraversalTests.cs | 1 - .../TraversalContextExtensionsTests.cs | 1 - .../Speckle.Sdk.Tests.Unit/Models/Hashing.cs | 1 - .../Models/SpeckleType.cs | 1 - .../Models/TraversalTests.cs | 1 - .../Models/UtilitiesTests.cs | 1 - .../SQLite/SQLiteJsonCacheManagerTests.cs | 1 - .../SQLite/SQLiteJsonExceptionTests.cs | 1 - .../Serialisation/BatchTests.cs | 1 - .../Serialisation/ChunkingTests.cs | 1 - .../Serialisation/JsonIgnoreAttributeTests.cs | 1 - .../ObjectModelDeprecationTests.cs | 1 - .../SerializerBreakingChanges.cs | 1 - .../SerializerNonBreakingChanges.cs | 1 - .../Serialisation/SimpleRoundTripTests.cs | 1 - .../Speckle.Sdk.Tests.Unit.csproj | 3 +- .../Transports/DiskTransportTests.cs | 1 - .../Transports/MemoryTransportTests.cs | 1 - .../Transports/SQLiteTransport2Tests.cs | 1 - .../Transports/SQLiteTransportTests.cs | 1 - .../Transports/TransportTests.cs | 1 - .../Speckle.Sdk.Tests.Unit/packages.lock.json | 168 ++++++++++++++++-- 66 files changed, 509 insertions(+), 85 deletions(-) rename src/Speckle.Sdk/Helpers/{Http.cs => SpeckleHttp.cs} (92%) create mode 100644 tests/Speckle.Sdk.Testing/MoqTest.cs create mode 100644 tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs create mode 100644 tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs diff --git a/src/Speckle.Sdk/Helpers/Http.cs b/src/Speckle.Sdk/Helpers/SpeckleHttp.cs similarity index 92% rename from src/Speckle.Sdk/Helpers/Http.cs rename to src/Speckle.Sdk/Helpers/SpeckleHttp.cs index a468abd0..3cea1aa6 100644 --- a/src/Speckle.Sdk/Helpers/Http.cs +++ b/src/Speckle.Sdk/Helpers/SpeckleHttp.cs @@ -15,10 +15,15 @@ public class SpeckleHttp(ILogger logger, ISpeckleHttpClientHandlerF /// The URI that should be pinged /// Request to failed public async Task HttpPing(Uri uri) + { + using var httpClient = CreateHttpClient(); + return await HttpPing(uri, httpClient).ConfigureAwait(false); + } + + public async Task HttpPing(Uri uri, HttpClient httpClient) { try { - using var httpClient = CreateHttpClient(); HttpResponseMessage response = await httpClient.GetAsync(uri).ConfigureAwait(false); response.EnsureSuccessStatusCode(); logger.LogInformation("Successfully pinged {uri}", uri); diff --git a/tests/Speckle.Objects.Tests.Unit/packages.lock.json b/tests/Speckle.Objects.Tests.Unit/packages.lock.json index d2993f2e..ee89df73 100644 --- a/tests/Speckle.Objects.Tests.Unit/packages.lock.json +++ b/tests/Speckle.Objects.Tests.Unit/packages.lock.json @@ -69,6 +69,14 @@ "resolved": "0.26.0", "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, "DiffEngine": { "type": "Transitive", "resolved": "15.9.0", @@ -256,6 +264,11 @@ "resolved": "4.5.0", "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, "System.IO.Hashing": { "type": "Transitive", "resolved": "9.0.1", @@ -318,6 +331,20 @@ "resolved": "2.0.3", "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.18.0", + "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ==" + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.9.3", + "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", + "dependencies": { + "xunit.extensibility.core": "[2.9.3]", + "xunit.extensibility.execution": "[2.9.3]" + } + }, "xunit.extensibility.core": { "type": "Transitive", "resolved": "2.9.3", @@ -360,9 +387,11 @@ "type": "Project", "dependencies": { "Microsoft.NET.Test.Sdk": "[17.13.0, )", + "Moq": "[4.20.70, )", "Speckle.Sdk": "[1.0.0, )", "Verify.Quibble": "[2.1.1, )", "Verify.Xunit": "[28.10.1, )", + "xunit": "[2.9.3, )", "xunit.runner.visualstudio": "[3.0.2, )" } }, @@ -411,6 +440,15 @@ "Microsoft.Extensions.Options": "2.2.0" } }, + "Moq": { + "type": "CentralTransitive", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, "Speckle.DoubleNumerics": { "type": "CentralTransitive", "requested": "[4.1.0, )", @@ -448,6 +486,17 @@ "xunit.abstractions": "2.0.3", "xunit.extensibility.execution": "2.9.3" } + }, + "xunit": { + "type": "CentralTransitive", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "dependencies": { + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" + } } } } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs index d31c6441..5106d5b6 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ServerObjectManagerTests.cs @@ -1,5 +1,4 @@ -using System.Diagnostics.CodeAnalysis; -using System.Net; +using System.Net; using System.Text; using FluentAssertions; using HttpMultipartParser; @@ -13,22 +12,10 @@ using Speckle.Sdk.Logging; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Serialisation.V2; using Speckle.Sdk.Serialisation.V2.Send; +using Speckle.Sdk.Testing; namespace Speckle.Sdk.Serialization.Tests; -[ExcludeFromCodeCoverage] -public abstract class MoqTest : IDisposable -{ - protected MoqTest() => Repository = new(MockBehavior.Strict); - - public void Dispose() => Repository.VerifyAll(); - - protected MockRepository Repository { get; private set; } = new(MockBehavior.Strict); - - protected Mock Create(MockBehavior behavior = MockBehavior.Strict) - where T : class => Repository.Create(behavior); -} - public class ServerObjectManagerTests : MoqTest { [Fact] diff --git a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json index 3e40f9b6..977c8c56 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json +++ b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json @@ -367,6 +367,20 @@ "resolved": "2.0.3", "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.18.0", + "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ==" + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.9.3", + "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", + "dependencies": { + "xunit.extensibility.core": "[2.9.3]", + "xunit.extensibility.execution": "[2.9.3]" + } + }, "xunit.extensibility.core": { "type": "Transitive", "resolved": "2.9.3", @@ -409,9 +423,11 @@ "type": "Project", "dependencies": { "Microsoft.NET.Test.Sdk": "[17.13.0, )", + "Moq": "[4.20.70, )", "Speckle.Sdk": "[1.0.0, )", "Verify.Quibble": "[2.1.1, )", "Verify.Xunit": "[28.10.1, )", + "xunit": "[2.9.3, )", "xunit.runner.visualstudio": "[3.0.2, )" } }, @@ -497,6 +513,17 @@ "xunit.abstractions": "2.0.3", "xunit.extensibility.execution": "2.9.3" } + }, + "xunit": { + "type": "CentralTransitive", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "dependencies": { + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" + } } } } diff --git a/tests/Speckle.Sdk.Testing/MoqTest.cs b/tests/Speckle.Sdk.Testing/MoqTest.cs new file mode 100644 index 00000000..34e8391b --- /dev/null +++ b/tests/Speckle.Sdk.Testing/MoqTest.cs @@ -0,0 +1,17 @@ +using System.Diagnostics.CodeAnalysis; +using Moq; + +namespace Speckle.Sdk.Testing; + +[ExcludeFromCodeCoverage] +public abstract class MoqTest : IDisposable +{ + protected MoqTest() => Repository = new(MockBehavior.Strict); + + public void Dispose() => Repository.VerifyAll(); + + protected MockRepository Repository { get; private set; } = new(MockBehavior.Strict); + + protected Mock Create(MockBehavior behavior = MockBehavior.Strict) + where T : class => Repository.Create(behavior); +} diff --git a/tests/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj b/tests/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj index b5ecb4ed..2238b7c0 100644 --- a/tests/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj +++ b/tests/Speckle.Sdk.Testing/Speckle.Sdk.Testing.csproj @@ -7,8 +7,10 @@ + + diff --git a/tests/Speckle.Sdk.Testing/packages.lock.json b/tests/Speckle.Sdk.Testing/packages.lock.json index 9ea626a4..efeb5300 100644 --- a/tests/Speckle.Sdk.Testing/packages.lock.json +++ b/tests/Speckle.Sdk.Testing/packages.lock.json @@ -28,6 +28,15 @@ "Microsoft.SourceLink.Common": "8.0.0" } }, + "Moq": { + "type": "Direct", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, "PolySharp": { "type": "Direct", "requested": "[1.15.0, )", @@ -66,6 +75,17 @@ "xunit.extensibility.execution": "2.9.3" } }, + "xunit": { + "type": "Direct", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "dependencies": { + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" + } + }, "xunit.runner.visualstudio": { "type": "Direct", "requested": "[3.0.2, )", @@ -77,6 +97,14 @@ "resolved": "0.26.0", "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, "DiffEngine": { "type": "Transitive", "resolved": "15.9.0", @@ -264,6 +292,11 @@ "resolved": "4.5.0", "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, "System.IO.Hashing": { "type": "Transitive", "resolved": "9.0.1", @@ -326,6 +359,20 @@ "resolved": "2.0.3", "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg==" }, + "xunit.analyzers": { + "type": "Transitive", + "resolved": "1.18.0", + "contentHash": "OtFMHN8yqIcYP9wcVIgJrq01AfTxijjAqVDy/WeQVSyrDC1RzBWeQPztL49DN2syXRah8TYnfvk035s7L95EZQ==" + }, + "xunit.core": { + "type": "Transitive", + "resolved": "2.9.3", + "contentHash": "BiAEvqGvyme19wE0wTKdADH+NloYqikiU0mcnmiNyXaF9HyHmE6sr/3DC5vnBkgsWaE6yPyWszKSPSApWdRVeQ==", + "dependencies": { + "xunit.extensibility.core": "[2.9.3]", + "xunit.extensibility.execution": "[2.9.3]" + } + }, "xunit.extensibility.core": { "type": "Transitive", "resolved": "2.9.3", @@ -414,6 +461,12 @@ "requested": "[13.0.2, )", "resolved": "13.0.2", "contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA==" + }, + "xunit.assert": { + "type": "CentralTransitive", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "/Kq28fCE7MjOV42YLVRAJzRF0WmEqsmflm0cfpMjGtzQ2lR5mYVj1/i0Y8uDAOLczkL3/jArrwehfMD0YogMAA==" } } } diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs index 4f81fd93..4723201a 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs @@ -5,7 +5,6 @@ using GraphQL.Client.Http; using Speckle.Newtonsoft.Json; using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; -using Xunit; namespace Speckle.Sdk.Tests.Integration.Api.GraphQL; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs index f4f99370..4d20589b 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs @@ -2,7 +2,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs index 80611b01..1f350f33 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; using Speckle.Sdk.Common; -using Xunit; using Version = Speckle.Sdk.Api.GraphQL.Models.Version; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs index 91c995fd..d2e8fcde 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api.GraphQL.Enums; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs index 19051efb..57220eee 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs index 86e41c71..ad5e7482 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs @@ -2,7 +2,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Resources; using Speckle.Sdk.Credentials; -using Xunit; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs index 23137093..8c8d6aef 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs index 0a4efd57..5ff4700c 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api.GraphQL; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Common; -using Xunit; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs index 2fd429b3..0ee4201e 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs @@ -6,7 +6,6 @@ using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; using Speckle.Sdk.Common; -using Xunit; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs index 98cee1fe..05688815 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api.GraphQL.Enums; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs index 9abe9cce..de538053 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api.GraphQL.Enums; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; using Version = Speckle.Sdk.Api.GraphQL.Models.Version; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs index 321fdd2a..ce97649c 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Inputs; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Api.GraphQL.Resources; -using Xunit; using Version = Speckle.Sdk.Api.GraphQL.Models.Version; namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; diff --git a/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs b/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs index 43a93be8..dad46fb6 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Credentials/UserServerInfoTests.cs @@ -3,7 +3,6 @@ using GraphQL.Client.Http; using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; -using Xunit; namespace Speckle.Sdk.Tests.Integration.Credentials; diff --git a/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs b/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs index 99ccf856..f1c7cc8b 100644 --- a/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/MemoryTransportTests.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Integration; diff --git a/tests/Speckle.Sdk.Tests.Integration/packages.lock.json b/tests/Speckle.Sdk.Tests.Integration/packages.lock.json index be0544e4..df3c8e42 100644 --- a/tests/Speckle.Sdk.Tests.Integration/packages.lock.json +++ b/tests/Speckle.Sdk.Tests.Integration/packages.lock.json @@ -63,6 +63,38 @@ "resolved": "3.0.2", "contentHash": "oXbusR6iPq0xlqoikjdLvzh+wQDkMv9If58myz9MEzldS4nIcp442Btgs2sWbYWV+caEluMe2pQCZ0hUZgPiow==" }, + "Argon": { + "type": "Transitive", + "resolved": "0.26.0", + "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "DiffEngine": { + "type": "Transitive", + "resolved": "15.9.0", + "contentHash": "shE6+tO4w5BmQTX0z+WnUV4UfmPNn6oTqBINbkts6OP0Icyx5WROSDzjjb95EwVYC4IAS+PxxS4Vbapxz4hkdw==", + "dependencies": { + "EmptyFiles": "8.7.1", + "System.Management": "9.0.1" + } + }, + "EmptyFiles": { + "type": "Transitive", + "resolved": "8.7.1", + "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw==" + }, + "FSharp.Core": { + "type": "Transitive", + "resolved": "7.0.300", + "contentHash": "8vvItREJ1l5lcp3vBCSJ1mFevVAhR48I34DuF/EoUa7o1KlFpQpagyuZkVYMAsHPIjdp47ZxM9sI4eqeXaeWkA==" + }, "GraphQL.Client.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -177,6 +209,20 @@ "resolved": "13.0.1", "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" }, + "Quibble": { + "type": "Transitive", + "resolved": "0.3.1", + "contentHash": "LD6bz2p+4O/BQnmD4mqFZrmdN/IjsPo1wUvfmcH46Q05ng+dyMLl3d2ylj0x412F4fpJEtm0Z3EaCAx4FqgNuQ==", + "dependencies": { + "FSharp.Core": "7.0.300", + "System.Text.Json": "7.0.3" + } + }, + "SimpleInfoName": { + "type": "Transitive", + "resolved": "3.1.0", + "contentHash": "j+ENh86NhxrgDc6T1ueqIR2QOdDkSJY2dbTFyPN/JvIXifB4GHAunlMw/x7P6m7XaXEHr3s+SMZfKBlmnmkO6g==" + }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", "resolved": "2.1.4", @@ -207,11 +253,34 @@ "SQLitePCLRaw.core": "2.1.4" } }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "2J5uq+2smnj+u1jlyVJ6BGGqaK9fHcK/EwN7mbsuPqTI6dZr86br8Cg6o/5B+icQ9ANTvTDpJjnhDNtYYZijHQ==" + }, "System.ComponentModel.Annotations": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "jY+E/PElNWQiazN0YHqZGvcSedcZ4Wt0Os1nnJ2SzR3gWZlhNRDkSXOhuHJcLuImD8SrJQQ8TfU0W4mVcit2hg==" + }, + "System.Management": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "CLEo9O6FuO4GQ3ZQkGssg9CJ2w2TN7GMFf3wHTc7YVWJV4xoyJRPw+XIDQnCcSUJCrHhrAWOO60cAX29EV5LFQ==", + "dependencies": { + "System.CodeDom": "9.0.1" + } + }, "System.Memory": { "type": "Transitive", "resolved": "4.5.3", @@ -232,6 +301,30 @@ "resolved": "4.5.1", "contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==" }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.4", + "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "Verify": { + "type": "Transitive", + "resolved": "28.10.1", + "contentHash": "2B/VtFN5jtF5g28kaM4GdJZTwb3pisd4+wL2NEPi9ZYe2lghWsCzS30V6LF1ILApLBfAorAstkU/Vw3sDWRqrg==", + "dependencies": { + "Argon": "0.26.0", + "DiffEngine": "15.9.0", + "SimpleInfoName": "3.1.0", + "System.IO.Hashing": "9.0.1" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -283,16 +376,29 @@ "speckle.sdk.dependencies": { "type": "Project" }, + "speckle.sdk.testing": { + "type": "Project", + "dependencies": { + "Microsoft.NET.Test.Sdk": "[17.13.0, )", + "Moq": "[4.20.70, )", + "Speckle.Sdk": "[1.0.0, )", + "Verify.Quibble": "[2.1.1, )", + "Verify.Xunit": "[28.10.1, )", + "xunit": "[2.9.3, )", + "xunit.runner.visualstudio": "[3.0.2, )" + } + }, "speckle.sdk.tests.unit": { "type": "Project", "dependencies": { "AwesomeAssertions": "[8.0.0, )", "Microsoft.Extensions.DependencyInjection": "[2.2.0, )", "Microsoft.NET.Test.Sdk": "[17.13.0, )", + "RichardSzalay.MockHttp": "[7.0.0, )", "Speckle.DoubleNumerics": "[4.1.0, )", "Speckle.Sdk": "[1.0.0, )", + "Speckle.Sdk.Testing": "[1.0.0, )", "altcover": "[9.0.1, )", - "xunit": "[2.9.3, )", "xunit.runner.visualstudio": "[3.0.2, )" } }, @@ -356,6 +462,21 @@ "Microsoft.Extensions.Options": "2.2.0" } }, + "Moq": { + "type": "CentralTransitive", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, + "RichardSzalay.MockHttp": { + "type": "CentralTransitive", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "QwnauYiaywp65QKFnP+wvgiQ2D8Pv888qB2dyfd7MSVDF06sIvxqASenk+RxsWybyyt+Hu1Y251wQxpHTv3UYg==" + }, "Speckle.DoubleNumerics": { "type": "CentralTransitive", "requested": "[4.1.0, )", @@ -368,6 +489,32 @@ "resolved": "13.0.2", "contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA==" }, + "Verify.Quibble": { + "type": "CentralTransitive", + "requested": "[2.1.1, )", + "resolved": "2.1.1", + "contentHash": "Z8bVwFICa3Dog6Mcnx0wlrn4Y+CFpQXx1f+ijfLn6/v4q00q+jLm9Gu/nVyUFuc75cjn6ieI08UrqXKcR9fTYw==", + "dependencies": { + "Quibble": "0.3.1", + "System.Text.Json": "8.0.4", + "Verify": "26.1.1" + } + }, + "Verify.Xunit": { + "type": "CentralTransitive", + "requested": "[28.10.1, )", + "resolved": "28.10.1", + "contentHash": "mkG7agMlx8oAEGcHoRY72hyDyNTdLIrzbfmniXFQgQ3yKulAHSYvYc9quzhpg0Sy+jb3svbdLqnRSg0VRhet3A==", + "dependencies": { + "Argon": "0.26.0", + "DiffEngine": "15.9.0", + "SimpleInfoName": "3.1.0", + "System.IO.Hashing": "9.0.1", + "Verify": "28.10.1", + "xunit.abstractions": "2.0.3", + "xunit.extensibility.execution": "2.9.3" + } + }, "xunit.assert": { "type": "CentralTransitive", "requested": "[2.9.3, )", diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs b/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs index af764b5d..9c2b3e37 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs @@ -4,7 +4,6 @@ using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Api; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs new file mode 100644 index 00000000..a02b9ce5 --- /dev/null +++ b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs @@ -0,0 +1,3 @@ +namespace Speckle.Sdk.Tests.Unit.Api.GraphQL; + +public class Client { } diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs index 3a06614f..a41f8c10 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQLErrorHandler.cs @@ -2,7 +2,6 @@ using GraphQL; using Speckle.Sdk.Api; using Speckle.Sdk.Api.GraphQL; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Api; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs index 1240254e..1397a9ec 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/ClosureTests.cs @@ -7,7 +7,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs index 1079ef52..00288a36 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.Exceptional.cs @@ -1,5 +1,4 @@ using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs index 8df3a466..8ca3a9a9 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/OperationsReceiveTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs index 3e402fc8..94704b0c 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendObjectReferences.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs index 813d9307..ab85188d 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SendReceiveLocal.cs @@ -6,7 +6,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs index b5dc30fe..b119382d 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/Operations/SerializationTests.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; -using Xunit; using Point = Speckle.Sdk.Tests.Unit.Host.Point; namespace Speckle.Sdk.Tests.Unit.Api.Operations; diff --git a/tests/Speckle.Sdk.Tests.Unit/Assembly.cs b/tests/Speckle.Sdk.Tests.Unit/Assembly.cs index a4bcec54..c7fc3b1f 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Assembly.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Assembly.cs @@ -1,3 +1 @@ -using Xunit; - -[assembly: CollectionBehavior(DisableTestParallelization = true)] +[assembly: CollectionBehavior(DisableTestParallelization = true)] diff --git a/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs b/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs index a9ac02d5..3dc8f2ce 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Common/NotNullTests.cs @@ -1,6 +1,5 @@ using FluentAssertions; using Speckle.Sdk.Common; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Common; diff --git a/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs b/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs index 575277bd..05be88c9 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Common/RangeFromTests.cs @@ -1,5 +1,4 @@ using Speckle.Sdk.Dependencies; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Common; diff --git a/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs b/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs index 3f8caa7c..538a4b87 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Common/UnitsTest.cs @@ -1,6 +1,5 @@ using FluentAssertions; using Speckle.Sdk.Common; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Common; diff --git a/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs index b61eae75..ccf8a553 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Credentials/AccountServerMigrationTests.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Credentials; diff --git a/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs b/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs index ac9df5f0..ad18d9d2 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Credentials/Accounts.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api.GraphQL.Models; using Speckle.Sdk.Credentials; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Credentials; diff --git a/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs b/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs index 422dcbbe..73280f59 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Helpers/Path.cs @@ -1,7 +1,6 @@ using System.Runtime.InteropServices; using FluentAssertions; using Speckle.Sdk.Logging; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Helpers; diff --git a/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs b/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs new file mode 100644 index 00000000..b8cc97e1 --- /dev/null +++ b/tests/Speckle.Sdk.Tests.Unit/Helpers/SpeckleHttpTests.cs @@ -0,0 +1,42 @@ +using System.Net; +using Microsoft.Extensions.Logging; +using Moq; +using RichardSzalay.MockHttp; +using Speckle.Sdk.Helpers; +using Speckle.Sdk.Testing; + +namespace Speckle.Sdk.Tests.Unit.Helpers; + +public class SpeckleHttpTests : MoqTest +{ + [Fact] + public async Task HttpPing() + { + using var mockHttp = new MockHttpMessageHandler(); + var speckleHttp = new SpeckleHttp( + Create>(MockBehavior.Loose).Object, + Create().Object + ); + + var uri = new Uri("https://speckle.xyz"); + mockHttp.When(uri.AbsoluteUri).Respond("application/json", "{}"); + var response = await speckleHttp.HttpPing(uri, mockHttp.ToHttpClient()); + Assert.NotNull(response); + } + + [Fact] + public async Task HttpPing_Failed() + { + using var mockHttp = new MockHttpMessageHandler(); + var speckleHttp = new SpeckleHttp( + Create>(MockBehavior.Loose).Object, + Create().Object + ); + + var uri = new Uri("https://speckle.xyz"); + mockHttp.When(uri.AbsoluteUri).Respond(HttpStatusCode.Unauthorized); + await Assert.ThrowsAsync( + async () => await speckleHttp.HttpPing(uri, mockHttp.ToHttpClient()) + ); + } +} diff --git a/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs index 87d5aa3c..288f5656 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs @@ -1,6 +1,5 @@ using FluentAssertions; using Speckle.Sdk.Host; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Host; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs index c658b48a..36dea4e9 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/BaseTests.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Speckle.Sdk.Common; using Speckle.Sdk.Host; using Speckle.Sdk.Models; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Models; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs index f0a24de5..462d56ba 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/BaseExtensionsTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Models.Collections; using Speckle.Sdk.Models.Extensions; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Models.Extensions; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs index b000afcc..a66c3f64 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/DisplayValueTests.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Models.Extensions; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Models.Extensions; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs index 4b5c3750..317080a1 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Extensions/ExceptionTests.cs @@ -1,6 +1,5 @@ using FluentAssertions; using Speckle.Sdk.Models.Extensions; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Models.Extensions; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs index 945102a4..5771daf3 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/GraphTraversalTests.cs @@ -3,7 +3,6 @@ using FluentAssertions; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Models.GraphTraversal; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Models.GraphTraversal; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs index d8c6f072..f1841970 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/GraphTraversal/TraversalContextExtensionsTests.cs @@ -3,7 +3,6 @@ using Speckle.Sdk.Common; using Speckle.Sdk.Models; using Speckle.Sdk.Models.Collections; using Speckle.Sdk.Models.GraphTraversal; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Models.GraphTraversal; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs b/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs index decd2b33..9de09c2d 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/Hashing.cs @@ -3,7 +3,6 @@ using FluentAssertions; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Models; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs b/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs index 63500570..b92de3c3 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/SpeckleType.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Models.TestModels; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Models { diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs index da0c804b..ef705359 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/TraversalTests.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Speckle.Sdk.Common; using Speckle.Sdk.Models; using Speckle.Sdk.Models.Extensions; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Models; diff --git a/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs b/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs index 72f71821..32bf1d17 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Models/UtilitiesTests.cs @@ -1,7 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Dependencies; using Speckle.Sdk.Helpers; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Models; diff --git a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs index 49c2a549..6496451e 100644 --- a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonCacheManagerTests.cs @@ -1,6 +1,5 @@ using FluentAssertions; using Speckle.Sdk.SQLite; -using Xunit; namespace Speckle.Sdk.Tests.Unit.SQLite; diff --git a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs index 91721a95..434aa223 100644 --- a/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/SQLite/SQLiteJsonExceptionTests.cs @@ -1,6 +1,5 @@ using Microsoft.Data.Sqlite; using Speckle.Sdk.SQLite; -using Xunit; namespace Speckle.Sdk.Tests.Unit.SQLite; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs index de6f38a0..018b4f30 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs @@ -1,7 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Dependencies; using Speckle.Sdk.Serialisation.V2.Send; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs index 7eb55588..3fa44af0 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ChunkingTests.cs @@ -4,7 +4,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs index 2b03a901..7861b723 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/JsonIgnoreAttributeTests.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs index eae0825c..350651bd 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/ObjectModelDeprecationTests.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation.Deprecated; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Serialisation { diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs index a2510abe..93eec8cf 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerBreakingChanges.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Tests.Unit.Host; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs index 42397f93..ba7b231c 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SerializerNonBreakingChanges.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; -using Xunit; using Matrix4x4 = Speckle.DoubleNumerics.Matrix4x4; namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs index dc6e8cb2..63c64a26 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs @@ -5,7 +5,6 @@ using Speckle.Sdk.Api; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Serialisation; diff --git a/tests/Speckle.Sdk.Tests.Unit/Speckle.Sdk.Tests.Unit.csproj b/tests/Speckle.Sdk.Tests.Unit/Speckle.Sdk.Tests.Unit.csproj index 5449b7dc..92ef4b7c 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Speckle.Sdk.Tests.Unit.csproj +++ b/tests/Speckle.Sdk.Tests.Unit/Speckle.Sdk.Tests.Unit.csproj @@ -10,14 +10,15 @@ + - + diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs index d903a902..68e3d627 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs @@ -1,7 +1,6 @@ using FluentAssertions; using Speckle.Sdk.Common; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Transports; diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs index e457c1a7..a3567f69 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/MemoryTransportTests.cs @@ -3,7 +3,6 @@ using FluentAssertions; using Speckle.Sdk.Common; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Transports; diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs index e4d20cf4..5b82d283 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransport2Tests.cs @@ -3,7 +3,6 @@ using Microsoft.Data.Sqlite; using Speckle.Sdk.Common; using Speckle.Sdk.Serialisation.Utilities; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Transports; diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs index 1a385466..9c759b6f 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/SQLiteTransportTests.cs @@ -1,7 +1,6 @@ using FluentAssertions; using Microsoft.Data.Sqlite; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Transports; diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs index 2aa32fdf..4a409b1b 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Transports/TransportTests.cs @@ -2,7 +2,6 @@ using FluentAssertions; using Speckle.Newtonsoft.Json; using Speckle.Sdk.Common; using Speckle.Sdk.Transports; -using Xunit; namespace Speckle.Sdk.Tests.Unit.Transports; diff --git a/tests/Speckle.Sdk.Tests.Unit/packages.lock.json b/tests/Speckle.Sdk.Tests.Unit/packages.lock.json index 09c4e740..88527280 100644 --- a/tests/Speckle.Sdk.Tests.Unit/packages.lock.json +++ b/tests/Speckle.Sdk.Tests.Unit/packages.lock.json @@ -55,6 +55,12 @@ "resolved": "1.15.0", "contentHash": "FbU0El+EEjdpuIX4iDbeS7ki1uzpJPx8vbqOzEtqnl1GZeAGJfq+jCbxeJL2y0EPnUNk8dRnnqR2xnYXg9Tf+g==" }, + "RichardSzalay.MockHttp": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "QwnauYiaywp65QKFnP+wvgiQ2D8Pv888qB2dyfd7MSVDF06sIvxqASenk+RxsWybyyt+Hu1Y251wQxpHTv3UYg==" + }, "Speckle.DoubleNumerics": { "type": "Direct", "requested": "[4.1.0, )", @@ -67,23 +73,44 @@ "resolved": "0.9.6", "contentHash": "HKH7tYrYYlCK1ct483hgxERAdVdMtl7gUKW9ijWXxA1UsYR4Z+TrRHYmzZ9qmpu1NnTycSrp005NYM78GDKV1w==" }, - "xunit": { - "type": "Direct", - "requested": "[2.9.3, )", - "resolved": "2.9.3", - "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", - "dependencies": { - "xunit.analyzers": "1.18.0", - "xunit.assert": "2.9.3", - "xunit.core": "[2.9.3]" - } - }, "xunit.runner.visualstudio": { "type": "Direct", "requested": "[3.0.2, )", "resolved": "3.0.2", "contentHash": "oXbusR6iPq0xlqoikjdLvzh+wQDkMv9If58myz9MEzldS4nIcp442Btgs2sWbYWV+caEluMe2pQCZ0hUZgPiow==" }, + "Argon": { + "type": "Transitive", + "resolved": "0.26.0", + "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" + }, + "Castle.Core": { + "type": "Transitive", + "resolved": "5.1.1", + "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==", + "dependencies": { + "System.Diagnostics.EventLog": "6.0.0" + } + }, + "DiffEngine": { + "type": "Transitive", + "resolved": "15.9.0", + "contentHash": "shE6+tO4w5BmQTX0z+WnUV4UfmPNn6oTqBINbkts6OP0Icyx5WROSDzjjb95EwVYC4IAS+PxxS4Vbapxz4hkdw==", + "dependencies": { + "EmptyFiles": "8.7.1", + "System.Management": "9.0.1" + } + }, + "EmptyFiles": { + "type": "Transitive", + "resolved": "8.7.1", + "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw==" + }, + "FSharp.Core": { + "type": "Transitive", + "resolved": "7.0.300", + "contentHash": "8vvItREJ1l5lcp3vBCSJ1mFevVAhR48I34DuF/EoUa7o1KlFpQpagyuZkVYMAsHPIjdp47ZxM9sI4eqeXaeWkA==" + }, "GraphQL.Client.Abstractions": { "type": "Transitive", "resolved": "6.0.0", @@ -198,6 +225,20 @@ "resolved": "13.0.1", "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" }, + "Quibble": { + "type": "Transitive", + "resolved": "0.3.1", + "contentHash": "LD6bz2p+4O/BQnmD4mqFZrmdN/IjsPo1wUvfmcH46Q05ng+dyMLl3d2ylj0x412F4fpJEtm0Z3EaCAx4FqgNuQ==", + "dependencies": { + "FSharp.Core": "7.0.300", + "System.Text.Json": "7.0.3" + } + }, + "SimpleInfoName": { + "type": "Transitive", + "resolved": "3.1.0", + "contentHash": "j+ENh86NhxrgDc6T1ueqIR2QOdDkSJY2dbTFyPN/JvIXifB4GHAunlMw/x7P6m7XaXEHr3s+SMZfKBlmnmkO6g==" + }, "SQLitePCLRaw.bundle_e_sqlite3": { "type": "Transitive", "resolved": "2.1.4", @@ -228,11 +269,34 @@ "SQLitePCLRaw.core": "2.1.4" } }, + "System.CodeDom": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "2J5uq+2smnj+u1jlyVJ6BGGqaK9fHcK/EwN7mbsuPqTI6dZr86br8Cg6o/5B+icQ9ANTvTDpJjnhDNtYYZijHQ==" + }, "System.ComponentModel.Annotations": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==" }, + "System.Diagnostics.EventLog": { + "type": "Transitive", + "resolved": "6.0.0", + "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" + }, + "System.IO.Hashing": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "jY+E/PElNWQiazN0YHqZGvcSedcZ4Wt0Os1nnJ2SzR3gWZlhNRDkSXOhuHJcLuImD8SrJQQ8TfU0W4mVcit2hg==" + }, + "System.Management": { + "type": "Transitive", + "resolved": "9.0.1", + "contentHash": "CLEo9O6FuO4GQ3ZQkGssg9CJ2w2TN7GMFf3wHTc7YVWJV4xoyJRPw+XIDQnCcSUJCrHhrAWOO60cAX29EV5LFQ==", + "dependencies": { + "System.CodeDom": "9.0.1" + } + }, "System.Memory": { "type": "Transitive", "resolved": "4.5.3", @@ -253,6 +317,30 @@ "resolved": "4.5.1", "contentHash": "Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==" }, + "System.Text.Encodings.Web": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "yev/k9GHAEGx2Rg3/tU6MQh4HGBXJs70y7j1LaM1i/ER9po+6nnQ6RRqTJn1E7Xu0fbIFK80Nh5EoODxrbxwBQ==" + }, + "System.Text.Json": { + "type": "Transitive", + "resolved": "8.0.4", + "contentHash": "bAkhgDJ88XTsqczoxEMliSrpijKZHhbJQldhAmObj/RbrN3sU5dcokuXmWJWsdQAhiMJ9bTayWsL1C9fbbCRhw==", + "dependencies": { + "System.Text.Encodings.Web": "8.0.0" + } + }, + "Verify": { + "type": "Transitive", + "resolved": "28.10.1", + "contentHash": "2B/VtFN5jtF5g28kaM4GdJZTwb3pisd4+wL2NEPi9ZYe2lghWsCzS30V6LF1ILApLBfAorAstkU/Vw3sDWRqrg==", + "dependencies": { + "Argon": "0.26.0", + "DiffEngine": "15.9.0", + "SimpleInfoName": "3.1.0", + "System.IO.Hashing": "9.0.1" + } + }, "xunit.abstractions": { "type": "Transitive", "resolved": "2.0.3", @@ -304,6 +392,18 @@ "speckle.sdk.dependencies": { "type": "Project" }, + "speckle.sdk.testing": { + "type": "Project", + "dependencies": { + "Microsoft.NET.Test.Sdk": "[17.13.0, )", + "Moq": "[4.20.70, )", + "Speckle.Sdk": "[1.0.0, )", + "Verify.Quibble": "[2.1.1, )", + "Verify.Xunit": "[28.10.1, )", + "xunit": "[2.9.3, )", + "xunit.runner.visualstudio": "[3.0.2, )" + } + }, "GraphQL.Client": { "type": "CentralTransitive", "requested": "[6.0.0, )", @@ -349,12 +449,58 @@ "Microsoft.Extensions.Options": "2.2.0" } }, + "Moq": { + "type": "CentralTransitive", + "requested": "[4.20.70, )", + "resolved": "4.20.70", + "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "dependencies": { + "Castle.Core": "5.1.1" + } + }, "Speckle.Newtonsoft.Json": { "type": "CentralTransitive", "requested": "[13.0.2, )", "resolved": "13.0.2", "contentHash": "g1BejUZwax5PRfL6xHgLEK23sqHWOgOj9hE7RvfRRlN00AGt8GnPYt8HedSK7UB3HiRW8zCA9Pn0iiYxCK24BA==" }, + "Verify.Quibble": { + "type": "CentralTransitive", + "requested": "[2.1.1, )", + "resolved": "2.1.1", + "contentHash": "Z8bVwFICa3Dog6Mcnx0wlrn4Y+CFpQXx1f+ijfLn6/v4q00q+jLm9Gu/nVyUFuc75cjn6ieI08UrqXKcR9fTYw==", + "dependencies": { + "Quibble": "0.3.1", + "System.Text.Json": "8.0.4", + "Verify": "26.1.1" + } + }, + "Verify.Xunit": { + "type": "CentralTransitive", + "requested": "[28.10.1, )", + "resolved": "28.10.1", + "contentHash": "mkG7agMlx8oAEGcHoRY72hyDyNTdLIrzbfmniXFQgQ3yKulAHSYvYc9quzhpg0Sy+jb3svbdLqnRSg0VRhet3A==", + "dependencies": { + "Argon": "0.26.0", + "DiffEngine": "15.9.0", + "SimpleInfoName": "3.1.0", + "System.IO.Hashing": "9.0.1", + "Verify": "28.10.1", + "xunit.abstractions": "2.0.3", + "xunit.extensibility.execution": "2.9.3" + } + }, + "xunit": { + "type": "CentralTransitive", + "requested": "[2.9.3, )", + "resolved": "2.9.3", + "contentHash": "TlXQBinK35LpOPKHAqbLY4xlEen9TBafjs0V5KnA4wZsoQLQJiirCR4CbIXvOH8NzkW4YeJKP5P/Bnrodm0h9Q==", + "dependencies": { + "xunit.analyzers": "1.18.0", + "xunit.assert": "2.9.3", + "xunit.core": "[2.9.3]" + } + }, "xunit.assert": { "type": "CentralTransitive", "requested": "[2.9.3, )", From 82e3d37dd1898fafb2af9adf94e005373945d621 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Fri, 7 Mar 2025 11:12:31 +0000 Subject: [PATCH 24/37] graphql test with client --- src/Speckle.Sdk/Api/GraphQL/Client.cs | 14 +++++- src/Speckle.Sdk/Api/GraphQL/ClientFactory.cs | 4 +- src/Speckle.Sdk/Helpers/SerializerIdWriter.cs | 3 ++ .../GraphQL/GraphQLClientExceptionHandling.cs | 2 +- .../Resources/ActiveUserResourceTests.cs | 2 +- .../GraphQL/Resources/CommentResourceTests.cs | 2 +- .../ModelResourceExceptionalTests.cs | 2 +- .../GraphQL/Resources/ModelResourceTests.cs | 2 +- .../Resources/OtherUserResourceTests.cs | 2 +- .../ProjectInviteResourceExceptionalTests.cs | 2 +- .../Resources/ProjectInviteResourceTests.cs | 2 +- .../ProjectResourceExceptionalTests.cs | 2 +- .../GraphQL/Resources/ProjectResourceTests.cs | 4 +- .../Resources/SubscriptionResourceTests.cs | 2 +- .../GraphQL/Resources/VersionResourceTests.cs | 2 +- .../Speckle.Sdk.Tests.Integration/Fixtures.cs | 8 ++-- .../Benchmarks/GeneralSendTest.cs | 2 +- .../Api/ClientResiliencyPolicyTest.cs | 2 +- .../Api/GraphQL/Client.cs | 3 -- .../Api/GraphQL/ClientTests.cs | 48 +++++++++++++++++++ 20 files changed, 84 insertions(+), 26 deletions(-) delete mode 100644 tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs create mode 100644 tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/ClientTests.cs diff --git a/src/Speckle.Sdk/Api/GraphQL/Client.cs b/src/Speckle.Sdk/Api/GraphQL/Client.cs index d575e494..29516a9b 100644 --- a/src/Speckle.Sdk/Api/GraphQL/Client.cs +++ b/src/Speckle.Sdk/Api/GraphQL/Client.cs @@ -4,6 +4,7 @@ using System.Reflection; using GraphQL; using GraphQL.Client.Http; using Microsoft.Extensions.Logging; +using Speckle.InterfaceGenerator; using Speckle.Newtonsoft.Json; using Speckle.Newtonsoft.Json.Serialization; using Speckle.Sdk.Api.GraphQL; @@ -16,8 +17,14 @@ using Speckle.Sdk.Logging; namespace Speckle.Sdk.Api; +public partial interface IClient : IDisposable +{ + GraphQLHttpClient GQLClient { get; } +} + [SuppressMessage("Maintainability", "CA1506:Avoid excessive class coupling", Justification = "Class needs refactor")] -public sealed class Client : ISpeckleGraphQLClient, IDisposable +[GenerateAutoInterface] +public sealed class Client : ISpeckleGraphQLClient, IClient { private readonly ILogger _logger; private readonly ISdkActivityFactory _activityFactory; @@ -37,6 +44,7 @@ public sealed class Client : ISpeckleGraphQLClient, IDisposable private HttpClient HttpClient { get; } + [AutoInterfaceIgnore] public GraphQLHttpClient GQLClient { get; } /// @@ -67,6 +75,7 @@ public sealed class Client : ISpeckleGraphQLClient, IDisposable GQLClient = CreateGraphQLClient(account, HttpClient); } + [AutoInterfaceIgnore] public void Dispose() { try @@ -77,7 +86,7 @@ public sealed class Client : ISpeckleGraphQLClient, IDisposable catch (Exception ex) when (!ex.IsFatal()) { } } - internal async Task ExecuteWithResiliencePolicies(Func> func) => + public async Task ExecuteWithResiliencePolicies(Func> func) => await GraphQLRetry .ExecuteAsync( func, @@ -132,6 +141,7 @@ public sealed class Client : ISpeckleGraphQLClient, IDisposable } } + [AutoInterfaceIgnore] IDisposable ISpeckleGraphQLClient.SubscribeTo(GraphQLRequest request, Action callback) => SubscribeTo(request, callback); diff --git a/src/Speckle.Sdk/Api/GraphQL/ClientFactory.cs b/src/Speckle.Sdk/Api/GraphQL/ClientFactory.cs index c2af3e78..1cdb7f17 100644 --- a/src/Speckle.Sdk/Api/GraphQL/ClientFactory.cs +++ b/src/Speckle.Sdk/Api/GraphQL/ClientFactory.cs @@ -14,6 +14,6 @@ public class ClientFactory( ISpeckleHttp speckleHttp ) : IClientFactory { - public Client Create(Account account) => - new(loggerFactory.CreateLogger(), activityFactory, application, speckleHttp, account); + public IClient Create(Account account) => + new Client(loggerFactory.CreateLogger(), activityFactory, application, speckleHttp, account); } diff --git a/src/Speckle.Sdk/Helpers/SerializerIdWriter.cs b/src/Speckle.Sdk/Helpers/SerializerIdWriter.cs index 10dc3d03..e4b8f061 100644 --- a/src/Speckle.Sdk/Helpers/SerializerIdWriter.cs +++ b/src/Speckle.Sdk/Helpers/SerializerIdWriter.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using System.Text; using Speckle.Newtonsoft.Json; using Speckle.Sdk.Dependencies; @@ -5,6 +6,8 @@ using Speckle.Sdk.Serialisation; namespace Speckle.Sdk.Helpers; +//just a wrapper around a lot of newtonsoft overloads +[ExcludeFromCodeCoverage] public sealed class SerializerIdWriter : JsonWriter { private readonly JsonWriter _jsonWriter; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs index 4723201a..b72b5977 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/GraphQLClientExceptionHandling.cs @@ -10,7 +10,7 @@ namespace Speckle.Sdk.Tests.Integration.Api.GraphQL; public class GraphQLClientExceptionHandling : IAsyncLifetime { - private Client _sut; + private IClient _sut; public Task DisposeAsync() => Task.CompletedTask; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs index 4d20589b..c4b277d4 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ActiveUserResourceTests.cs @@ -7,7 +7,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ActiveUserResourceTests : IAsyncLifetime { - private Client _testUser; + private IClient _testUser; private ActiveUserResource Sut => _testUser.ActiveUser; // Setup method for xUnit using IAsyncLifetime diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs index 1f350f33..0d59bd63 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/CommentResourceTests.cs @@ -10,7 +10,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class CommentResourceTests : IAsyncLifetime { - private Client _testUser; + private IClient _testUser; private CommentResource Sut; private Project _project; private Model _model; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs index d2e8fcde..7bc3a106 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceExceptionalTests.cs @@ -9,7 +9,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ModelResourceExceptionalTests : IAsyncLifetime { - private Client _testUser; + private IClient _testUser; private ModelResource Sut => _testUser.Model; private Project _project; private Model _model; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs index 57220eee..0b7b9481 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ModelResourceTests.cs @@ -8,7 +8,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ModelResourceTests : IAsyncLifetime { - private Client _testUser; + private IClient _testUser; private ModelResource Sut => _testUser.Model; private Project _project; private Model _model; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs index ad5e7482..81412bd9 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/OtherUserResourceTests.cs @@ -7,7 +7,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class OtherUserResourceTests { - private readonly Client _testUser; + private readonly IClient _testUser; private readonly Account _testData; private OtherUserResource Sut => _testUser.OtherUser; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs index 8c8d6aef..878f5f7a 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceExceptionalTests.cs @@ -8,7 +8,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ProjectInviteResourceExceptionalTests : IAsyncLifetime { - private Client _testUser; + private IClient _testUser; private Project _project; private ProjectInviteResource Sut => _testUser.ProjectInvite; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs index 5ff4700c..a3c9115d 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectInviteResourceTests.cs @@ -9,7 +9,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ProjectInviteResourceTests : IAsyncLifetime { - private Client _inviter, + private IClient _inviter, _invitee; private Project _project; private PendingStreamCollaborator _createdInvite; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs index 0ee4201e..ea669742 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceExceptionalTests.cs @@ -11,7 +11,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ProjectResourceExceptionalTests : IAsyncLifetime { - private Client _testUser, + private IClient _testUser, _secondUser, _unauthedUser; private Project _testProject; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs index 05688815..5a1e55f0 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs @@ -9,7 +9,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class ProjectResourceTests { - private readonly Client _testUser; + private readonly IClient _testUser; private readonly Project _testProject; private ProjectResource Sut => _testUser.Project; @@ -20,7 +20,7 @@ public class ProjectResourceTests (_testUser, _testProject) = setupTask.Result; } - private async Task<(Client TestUser, Project TestProject)> Setup() + private async Task<(IClient TestUser, Project TestProject)> Setup() { var testUser = await Fixtures.SeedUserWithClient(); var testProject = await testUser.Project.Create(new ProjectCreateInput("test project123", "desc", null)); diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs index de538053..7fa9d068 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/SubscriptionResourceTests.cs @@ -11,7 +11,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class SubscriptionResourceTests : IAsyncLifetime { private const int WAIT_PERIOD = 300; - private Client _testUser; + private IClient _testUser; private Project _testProject; private Model _testModel; private Version _testVersion; diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs index ce97649c..46f04165 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/VersionResourceTests.cs @@ -9,7 +9,7 @@ namespace Speckle.Sdk.Tests.Integration.API.GraphQL.Resources; public class VersionResourceTests : IAsyncLifetime { - private Client _testUser; + private IClient _testUser; private VersionResource Sut => _testUser.Version; private Project _project; private Model _model1; diff --git a/tests/Speckle.Sdk.Tests.Integration/Fixtures.cs b/tests/Speckle.Sdk.Tests.Integration/Fixtures.cs index bef9259f..a8afbc0c 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Fixtures.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Fixtures.cs @@ -30,17 +30,17 @@ public static class Fixtures ServiceProvider = TestServiceSetup.GetServiceProvider(); } - public static Client Unauthed => + public static IClient Unauthed => ServiceProvider .GetRequiredService() .Create(new Account { serverInfo = Server, userInfo = new UserInfo() }); - public static async Task SeedUserWithClient() + public static async Task SeedUserWithClient() { return ServiceProvider.GetRequiredService().Create(await SeedUser()); } - public static async Task CreateVersion(Client client, string projectId, string modelId) + public static async Task CreateVersion(IClient client, string projectId, string modelId) { using var remote = ServiceProvider.GetRequiredService().Create(client.Account, projectId); var (objectId, _) = await ServiceProvider @@ -157,7 +157,7 @@ public static class Fixtures return new Blob(filePath); } - internal static async Task CreateComment(Client client, string projectId, string modelId, string versionId) + internal static async Task CreateComment(IClient client, string projectId, string modelId, string versionId) { var blobs = await SendBlobData(client.Account, projectId); var blobIds = blobs.Select(b => b.id.NotNull()).ToList(); diff --git a/tests/Speckle.Sdk.Tests.Performance/Benchmarks/GeneralSendTest.cs b/tests/Speckle.Sdk.Tests.Performance/Benchmarks/GeneralSendTest.cs index 994ea723..d70c9735 100644 --- a/tests/Speckle.Sdk.Tests.Performance/Benchmarks/GeneralSendTest.cs +++ b/tests/Speckle.Sdk.Tests.Performance/Benchmarks/GeneralSendTest.cs @@ -26,7 +26,7 @@ public class GeneralSendTest private IOperations _operations; private ServerTransport _remote; private Account acc; - private Client client; + private IClient client; private Project _project; diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs b/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs index 9c2b3e37..68cbcfb8 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs @@ -9,7 +9,7 @@ namespace Speckle.Sdk.Tests.Unit.Api; public sealed class GraphQLClientTests : IDisposable { - private readonly Client _client; + private readonly IClient _client; public GraphQLClientTests() { diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs deleted file mode 100644 index a02b9ce5..00000000 --- a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/Client.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace Speckle.Sdk.Tests.Unit.Api.GraphQL; - -public class Client { } diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/ClientTests.cs b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/ClientTests.cs new file mode 100644 index 00000000..3739c9fc --- /dev/null +++ b/tests/Speckle.Sdk.Tests.Unit/Api/GraphQL/ClientTests.cs @@ -0,0 +1,48 @@ +using FluentAssertions; +using GraphQL; +using Microsoft.Extensions.Logging; +using Moq; +using RichardSzalay.MockHttp; +using Speckle.Sdk.Api; +using Speckle.Sdk.Api.GraphQL.Models; +using Speckle.Sdk.Credentials; +using Speckle.Sdk.Helpers; +using Speckle.Sdk.Logging; +using Speckle.Sdk.Testing; + +namespace Speckle.Sdk.Tests.Unit.Api.GraphQL; + +public class ClientTests : MoqTest +{ + [Fact] + //basic end to end GraphQL test as is. Avoids a proper request/response + public async Task ExecuteGraphQLRequest() + { + using var mockHandler = new MockHttpMessageHandler(); + mockHandler.When(HttpMethod.Post, "https://speckle.xyz/graphql").Respond("application/json", "{}"); + var httpClient = mockHandler.ToHttpClient(); + var token = "token"; + var uri = new Uri("https://speckle.xyz"); + + var speckleHttp = Create(); + speckleHttp.Setup(x => x.CreateHttpClient(null, 30, token)).Returns(httpClient); + + var application = Create(); + application.Setup(x => x.ApplicationAndVersion).Returns("test"); + + using var client = new Client( + Create>(MockBehavior.Loose).Object, + Create(MockBehavior.Loose).Object, + application.Object, + speckleHttp.Object, + new Account() + { + token = token, + serverInfo = new ServerInfo() { url = uri.AbsoluteUri }, + } + ); + + var x = await client.ExecuteGraphQLRequest(new GraphQLRequest(), CancellationToken.None); + x.Should().BeNull(); + } +} From a79f0fd0351de47e779fcb20ebffe084c3f80e6e Mon Sep 17 00:00:00 2001 From: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Sat, 8 Mar 2025 17:50:52 +0000 Subject: [PATCH 25/37] Deprecated public visibility (#249) --- src/Speckle.Sdk/Api/GraphQL/Enums/ProjectVisibility.cs | 8 +++++--- .../Api/GraphQL/Resources/ProjectResourceTests.cs | 4 ++-- .../Benchmarks/GeneralSendTest.cs | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Speckle.Sdk/Api/GraphQL/Enums/ProjectVisibility.cs b/src/Speckle.Sdk/Api/GraphQL/Enums/ProjectVisibility.cs index 5e4b1440..7bb78f78 100644 --- a/src/Speckle.Sdk/Api/GraphQL/Enums/ProjectVisibility.cs +++ b/src/Speckle.Sdk/Api/GraphQL/Enums/ProjectVisibility.cs @@ -2,7 +2,9 @@ public enum ProjectVisibility { - Private, - Public, - Unlisted, + Private = 0, + + [Obsolete("Use Unlisted instead", true)] + Public = 1, + Unlisted = 2, } diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs index 05688815..612b42a7 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs @@ -29,7 +29,7 @@ public class ProjectResourceTests [Theory] [InlineData("Very private project", "My secret project", ProjectVisibility.Private)] - [InlineData("Very public project", null, ProjectVisibility.Public)] + [InlineData("Very unlisted project", null, ProjectVisibility.Unlisted)] public async Task ProjectCreate_Should_CreateProjectSuccessfully( string name, string? description, @@ -70,7 +70,7 @@ public class ProjectResourceTests // Arrange const string NEW_NAME = "MY new name"; const string NEW_DESCRIPTION = "MY new desc"; - const ProjectVisibility NEW_VISIBILITY = ProjectVisibility.Public; + const ProjectVisibility NEW_VISIBILITY = ProjectVisibility.Unlisted; // Act var newProject = await Sut.Update( diff --git a/tests/Speckle.Sdk.Tests.Performance/Benchmarks/GeneralSendTest.cs b/tests/Speckle.Sdk.Tests.Performance/Benchmarks/GeneralSendTest.cs index 994ea723..4c424731 100644 --- a/tests/Speckle.Sdk.Tests.Performance/Benchmarks/GeneralSendTest.cs +++ b/tests/Speckle.Sdk.Tests.Performance/Benchmarks/GeneralSendTest.cs @@ -57,7 +57,7 @@ public class GeneralSendTest client = TestDataHelper.ServiceProvider.GetRequiredService().Create(acc); _project = await client.Project.Create( - new($"General Send Test run {Guid.NewGuid()}", null, ProjectVisibility.Public) + new($"General Send Test run {Guid.NewGuid()}", null, ProjectVisibility.Unlisted) ); _remote = TestDataHelper.ServiceProvider.GetRequiredService().Create(acc, _project.id); } From bd0997913abe613e39845a0f7f31be75a049ff89 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Mon, 10 Mar 2025 09:31:56 +0000 Subject: [PATCH 26/37] Add back the integration test --- .../Api/GraphQL/Resources/ProjectResourceTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs index 665c3ff4..98cee1fe 100644 --- a/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs +++ b/tests/Speckle.Sdk.Tests.Integration/Api/GraphQL/Resources/ProjectResourceTests.cs @@ -65,8 +65,8 @@ public class ProjectResourceTests result.createdAt.Should().Be(_testProject.createdAt); } - //[Fact] - private async Task ProjectUpdate_Should_UpdateProjectSuccessfully() + [Fact] + public async Task ProjectUpdate_Should_UpdateProjectSuccessfully() { // Arrange const string NEW_NAME = "MY new name"; From 2d134bf7e1b08f249657770d58002abe659068fa Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 11 Mar 2025 13:24:39 +0000 Subject: [PATCH 27/37] make ExecuteWithResiliencePolicies internal --- src/Speckle.Sdk/Api/GraphQL/Client.cs | 2 +- src/Speckle.Sdk/Assemby.cs | 3 +++ .../Api/ClientResiliencyPolicyTest.cs | 23 ++++++++++--------- 3 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 src/Speckle.Sdk/Assemby.cs diff --git a/src/Speckle.Sdk/Api/GraphQL/Client.cs b/src/Speckle.Sdk/Api/GraphQL/Client.cs index 29516a9b..58d92ea5 100644 --- a/src/Speckle.Sdk/Api/GraphQL/Client.cs +++ b/src/Speckle.Sdk/Api/GraphQL/Client.cs @@ -86,7 +86,7 @@ public sealed class Client : ISpeckleGraphQLClient, IClient catch (Exception ex) when (!ex.IsFatal()) { } } - public async Task ExecuteWithResiliencePolicies(Func> func) => + internal async Task ExecuteWithResiliencePolicies(Func> func) => await GraphQLRetry .ExecuteAsync( func, diff --git a/src/Speckle.Sdk/Assemby.cs b/src/Speckle.Sdk/Assemby.cs new file mode 100644 index 00000000..e64211a6 --- /dev/null +++ b/src/Speckle.Sdk/Assemby.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("Speckle.Sdk.Tests.Unit")] diff --git a/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs b/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs index 68cbcfb8..7b6d9748 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Api/ClientResiliencyPolicyTest.cs @@ -9,23 +9,24 @@ namespace Speckle.Sdk.Tests.Unit.Api; public sealed class GraphQLClientTests : IDisposable { - private readonly IClient _client; + private readonly Client _client; public GraphQLClientTests() { var serviceProvider = TestServiceSetup.GetServiceProvider(); - _client = serviceProvider - .GetRequiredService() - .Create( - new Account - { - token = "this is a scam", - serverInfo = new ServerInfo { url = "http://goto.testing" }, - } - ); + _client = (Client) + serviceProvider + .GetRequiredService() + .Create( + new Account + { + token = "this is a scam", + serverInfo = new ServerInfo { url = "http://goto.testing" }, + } + ); } - public void Dispose() => _client?.Dispose(); + public void Dispose() => _client.Dispose(); [Fact] public async Task TestExecuteWithResiliencePoliciesDoesntRetryTaskCancellation() From 93d517eab768ff97c10595d9423cc1bef46fc134 Mon Sep 17 00:00:00 2001 From: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Wed, 12 Mar 2025 08:29:30 +0000 Subject: [PATCH 28/37] test(objects): Verify tests for serialization (#227) * Objects Verify Tests * VerifyTests * Verify as array with deterministic order * lock * Updated verified --- tests/Speckle.Objects.Tests.Unit/Module.cs | 3 +- ...peckle.Objects.Geometry.Mesh.verified.json | 76 +++++++++++++++++++ ...eckle.Objects.Geometry.Point.verified.json | 11 +++ ...ckle.Objects.Geometry.Vector.verified.json | 12 +++ .../Serialization/ObjectsSerializationTest.cs | 33 ++++++++ .../Serialization/ObjectsTestData.cs | 46 +++++++++++ tests/Speckle.Sdk.Testing/SpeckleVerify.cs | 15 ++-- 7 files changed, 189 insertions(+), 7 deletions(-) create mode 100644 tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Mesh.verified.json create mode 100644 tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Point.verified.json create mode 100644 tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Vector.verified.json create mode 100644 tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.cs create mode 100644 tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsTestData.cs diff --git a/tests/Speckle.Objects.Tests.Unit/Module.cs b/tests/Speckle.Objects.Tests.Unit/Module.cs index 999f2e69..90adcf73 100644 --- a/tests/Speckle.Objects.Tests.Unit/Module.cs +++ b/tests/Speckle.Objects.Tests.Unit/Module.cs @@ -1,6 +1,7 @@ using System.Runtime.CompilerServices; using Speckle.Objects.Geometry; using Speckle.Sdk.Host; +using Speckle.Sdk.Models; using Speckle.Sdk.Testing; namespace Speckle.Objects.Tests.Unit; @@ -12,6 +13,6 @@ public static class Module { SpeckleVerify.Initialize(); TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Polyline).Assembly); + TypeLoader.Initialize(typeof(Base).Assembly, typeof(Polyline).Assembly); } } diff --git a/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Mesh.verified.json b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Mesh.verified.json new file mode 100644 index 00000000..19724719 --- /dev/null +++ b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Mesh.verified.json @@ -0,0 +1,76 @@ +[ + { + "applicationId": null, + "data": [ + 3, + 0, + 1, + 2 + ], + "id": "13da8e855141b835e68bba721411046e", + "speckle_type": "Speckle.Core.Models.DataChunk" + }, + { + "__closure": { + "13da8e855141b835e68bba721411046e": 100, + "cc9d42395b317ed25947b1285bbd5103": 100, + "ede4848fc3abda9275a19fee3447ffbd": 100 + }, + "applicationId": "asdfasdf", + "area": 42.0, + "bbox": null, + "colors": [ + { + "__closure": null, + "referencedId": "cc9d42395b317ed25947b1285bbd5103", + "speckle_type": "reference" + } + ], + "faces": [ + { + "__closure": null, + "referencedId": "13da8e855141b835e68bba721411046e", + "speckle_type": "reference" + } + ], + "id": "85fdad62ca935832449ffb359ebed7b8", + "speckle_type": "Objects.Geometry.Mesh", + "textureCoordinates": [], + "units": "m", + "vertexNormals": [], + "vertices": [ + { + "__closure": null, + "referencedId": "ede4848fc3abda9275a19fee3447ffbd", + "speckle_type": "reference" + } + ], + "volume": 420.0 + }, + { + "applicationId": null, + "data": [ + -10185235, + -10185235, + -10185235 + ], + "id": "cc9d42395b317ed25947b1285bbd5103", + "speckle_type": "Speckle.Core.Models.DataChunk" + }, + { + "applicationId": null, + "data": [ + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 1.0, + 1.0, + 0.0 + ], + "id": "ede4848fc3abda9275a19fee3447ffbd", + "speckle_type": "Speckle.Core.Models.DataChunk" + } +] diff --git a/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Point.verified.json b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Point.verified.json new file mode 100644 index 00000000..5d326b0d --- /dev/null +++ b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Point.verified.json @@ -0,0 +1,11 @@ +[ + { + "applicationId": "iosdf;juasdfioj", + "id": "035cad79be39e59c765b7946c4ea5f0c", + "speckle_type": "Objects.Geometry.Point", + "units": "ft", + "x": 123.123, + "y": 111.222, + "z": -0.001 + } +] \ No newline at end of file diff --git a/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Vector.verified.json b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Vector.verified.json new file mode 100644 index 00000000..5eb1d8cd --- /dev/null +++ b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.SerializeAndVerify_testCase=Speckle.Objects.Geometry.Vector.verified.json @@ -0,0 +1,12 @@ +[ + { + "applicationId": "iosdf;juasdfioj", + "bbox": null, + "id": "282d78f7ca1a2ec37bf3fcf3f24e7a27", + "speckle_type": "Objects.Geometry.Vector", + "units": "in", + "x": 321.321, + "y": 222.111, + "z": -1.001 + } +] \ No newline at end of file diff --git a/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.cs b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.cs new file mode 100644 index 00000000..7df8e299 --- /dev/null +++ b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsSerializationTest.cs @@ -0,0 +1,33 @@ +using Speckle.Sdk.Models; +using Speckle.Sdk.Serialisation; +using Speckle.Sdk.Serialisation.V2.Send; +using Speckle.Sdk.Testing; + +namespace Speckle.Objects.SerializationTests; + +public sealed class ObjectsSerializationTest +{ + [Theory] + [MemberData(nameof(ObjectsTestData.TheoryData), MemberType = typeof(ObjectsTestData))] + public async Task SerializeAndVerify(Base testCase) + { + var serialized = Serialize(testCase); + + await VerifySerialized(serialized).UseParameters(testCase); + } + + private static IReadOnlyList<(Id, Json, Dictionary)> Serialize(Base data) + { + using var serializer = new ObjectSerializerFactory(new BasePropertyGatherer()).Create( + new Dictionary(), + default + ); + return serializer.Serialize(data).ToList(); + } + + private static SettingsTask VerifySerialized(IReadOnlyList<(Id, Json, Dictionary)> serializedResult) + { + var jsons = serializedResult.OrderBy(x => x.Item1.Value).Select(x => x.Item2).ToArray(); + return SpeckleVerify.VerifyJsons(jsons); + } +} diff --git a/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsTestData.cs b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsTestData.cs new file mode 100644 index 00000000..9365a3d9 --- /dev/null +++ b/tests/Speckle.Objects.Tests.Unit/Serialization/ObjectsTestData.cs @@ -0,0 +1,46 @@ +using Speckle.Objects.Geometry; +using Speckle.Sdk.Common; +using Speckle.Sdk.Models; +using Point = Speckle.Objects.Geometry.Point; + +namespace Speckle.Objects.SerializationTests; + +public static class ObjectsTestData +{ + /// + /// Data set of simple valid Speckle Objects + /// Right now, we should have exactly one for each non-abstract object model. + /// + /// + private static IEnumerable Data() + { + yield return new Mesh() + { + vertices = [0d, 0d, 0d, 1d, 0d, 0d, 1d, 1d, 0d], + faces = [3, 0, 1, 2], + applicationId = "asdfasdf", + units = Units.Meters, + area = 42, + volume = 420, + colors = [-10185235, -10185235, -10185235], + }; + yield return new Point() + { + x = 123.123, + y = 111.222, + z = -0.001, + applicationId = "iosdf;juasdfioj", + units = Units.Feet, + }; + yield return new Vector() + { + x = 321.321, + y = 222.111, + z = -1.001, + applicationId = "iosdf;juasdfioj", + units = Units.Inches, + }; + } + + public static TheoryData TheoryData => new(Data()); +} diff --git a/tests/Speckle.Sdk.Testing/SpeckleVerify.cs b/tests/Speckle.Sdk.Testing/SpeckleVerify.cs index 4cb3946f..fda11211 100644 --- a/tests/Speckle.Sdk.Testing/SpeckleVerify.cs +++ b/tests/Speckle.Sdk.Testing/SpeckleVerify.cs @@ -42,16 +42,19 @@ public static class SpeckleVerify Converters = { new JsonStringSerializer() }, }; - private static async Task VerifyJsonObjects(IDictionary objects, string sourceFile) => - await VerifyJson(JObject.FromObject(objects, _jsonSerializer).ToString(), sourceFile: sourceFile); + private static SettingsTask VerifyJsonObjects(IDictionary objects, string sourceFile) => + VerifyJson(JObject.FromObject(objects, _jsonSerializer).ToString(), sourceFile: sourceFile); - public static async Task VerifyJsonDictionary( + public static SettingsTask VerifyJsonDictionary( IDictionary objects, [CallerFilePath] string sourceFile = "" - ) => await VerifyJsonObjects(objects.ToDictionary(x => x.Key, x => new Json(x.Value)), sourceFile); + ) => VerifyJsonObjects(objects.ToDictionary(x => x.Key, x => new Json(x.Value)), sourceFile); - public static async Task VerifyJsonDictionary( + public static SettingsTask VerifyJsonDictionary( IDictionary objects, [CallerFilePath] string sourceFile = "" - ) => await VerifyJsonObjects(objects.ToDictionary(x => x.Key.Value, x => x.Value), sourceFile); + ) => VerifyJsonObjects(objects.ToDictionary(x => x.Key.Value, x => x.Value), sourceFile); + + public static SettingsTask VerifyJsons(IReadOnlyCollection objects, [CallerFilePath] string sourceFile = "") => + VerifyJson(JArray.FromObject(objects, _jsonSerializer).ToString(), sourceFile: sourceFile); } From 404600a839385a8cb30b5fac51a59d74b927faea Mon Sep 17 00:00:00 2001 From: KatKatKateryna <89912278+KatKatKateryna@users.noreply.github.com> Date: Wed, 12 Mar 2025 11:10:45 +0000 Subject: [PATCH 29/37] Regions class (#241) * region class * comments * adjusted constructor * todos * comment * change displayValur to curves * small refactor * assign correct property * generalize display value * some minor xml changes * transform meshes; bbox not required * remove comment * Update Region.cs --------- Co-authored-by: Claire Kuang Co-authored-by: Adam Hathcock --- src/Speckle.Objects/Geometry/Region.cs | 97 ++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/Speckle.Objects/Geometry/Region.cs diff --git a/src/Speckle.Objects/Geometry/Region.cs b/src/Speckle.Objects/Geometry/Region.cs new file mode 100644 index 00000000..fcc044dd --- /dev/null +++ b/src/Speckle.Objects/Geometry/Region.cs @@ -0,0 +1,97 @@ +using Speckle.Objects.Other; +using Speckle.Sdk.Common; +using Speckle.Sdk.Models; + +namespace Speckle.Objects.Geometry; + +/// +/// Flat polygon, defined by an outer boundary and inner loops. +/// +[SpeckleType("Objects.Geometry.Region")] +public class Region : Base, IHasArea, IHasBoundingBox, ITransformable, IDisplayValue> +{ + /// + /// Boundary of a region. + /// Should be a planar, closed, non-self-intersecting ICurve. + /// + public required ICurve boundary { get; set; } + + /// + /// Loops (voids) in the region. + /// Each loop should be planar, closed, non-self-intersecting ICurve, located inside the boundary. + /// The loops should not intersect or touch each other. + /// + public required List innerLoops { get; set; } = new(); + + /// + /// The units of object's coordinates. + /// This should be one of + /// + public required string units { get; set; } + + /// + /// Indication whether the region is just a geometry (false) or has a hatch pattern (true). + /// It's a distinction for receiving in apps that support both Region and Hatch (aka region with hatch pattern) + /// + public required bool hasHatchPattern { get; set; } + + /// + public double area { get; set; } + + /// + public Box? bbox { get; set; } + + /// + [DetachProperty] + public List displayValue { get; set; } = new(); + + /// + public bool TransformTo(Transform transform, out ITransformable transformed) + { + // assign self to the returned object, in case transformation fails + transformed = this; + + // transform boundary + if (boundary is ITransformable boundaryTransformable) + { + boundaryTransformable.TransformTo(transform, out ITransformable transformedBoundaryResult); + var transformedBoundary = (ICurve)transformedBoundaryResult; + + // transform inner loops + var transformedLoops = new List(); + foreach (var loop in innerLoops) + { + if (loop is ITransformable loopTransformable) + { + loopTransformable.TransformTo(transform, out ITransformable transformedLoop); + transformedLoops.Add((ICurve)transformedLoop); + } + else + { + return false; + } + } + + // transform display meshes + var transformedMeshes = new List(); + foreach (var mesh in displayValue) + { + mesh.TransformTo(transform, out ITransformable transformedMesh); + transformedMeshes.Add((Mesh)transformedMesh); + } + + // if boundary and loops transformations succeeded + transformed = new Region + { + boundary = transformedBoundary, + innerLoops = transformedLoops, + hasHatchPattern = hasHatchPattern, + displayValue = transformedMeshes, + units = units, + }; + return true; + } + + return false; + } +} From 56ed399d70e3d7d3c4a778f99e5280f41bed36f0 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 26 Mar 2025 14:21:06 +0000 Subject: [PATCH 30/37] Removes log statement that is confusing people when viewing log files (#267) --- .../Serialization/BatchExtensions.cs | 4 ++-- .../Serialization/ChannelExtensions.cs | 2 -- .../Serialization/ChannelSaver.cs | 4 ++-- .../SizeBatchingChannelReader.cs | 3 +-- .../Serialisation/V2/Send/SerializeProcess.cs | 6 +---- .../Serialisation/BatchTests.cs | 24 +++++-------------- 6 files changed, 12 insertions(+), 31 deletions(-) diff --git a/src/Speckle.Sdk.Dependencies/Serialization/BatchExtensions.cs b/src/Speckle.Sdk.Dependencies/Serialization/BatchExtensions.cs index 6867204c..fd1856ad 100644 --- a/src/Speckle.Sdk.Dependencies/Serialization/BatchExtensions.cs +++ b/src/Speckle.Sdk.Dependencies/Serialization/BatchExtensions.cs @@ -19,13 +19,13 @@ public static class BatchExtensions public static void AddBatchItem(this IMemoryOwner batch, T item) where T : IHasByteSize => ((Batch)batch).Add(item); - public static int GetBatchSize(this IMemoryOwner batch, Action logAsWarning, int maxBatchSize) + public static int GetBatchSize(this IMemoryOwner batch, int maxBatchSize) where T : IHasByteSize { var currentSize = ((Batch)batch).BatchByteSize; if (currentSize > maxBatchSize) { - logAsWarning($"Batch size exceeded. Current size: {currentSize} bytes. Max size: {maxBatchSize} bytes."); + //doing this to say it's full since the channel reader only does full being equivalent return maxBatchSize; } diff --git a/src/Speckle.Sdk.Dependencies/Serialization/ChannelExtensions.cs b/src/Speckle.Sdk.Dependencies/Serialization/ChannelExtensions.cs index f8f3524c..4133f2eb 100644 --- a/src/Speckle.Sdk.Dependencies/Serialization/ChannelExtensions.cs +++ b/src/Speckle.Sdk.Dependencies/Serialization/ChannelExtensions.cs @@ -8,7 +8,6 @@ public static class ChannelExtensions { public static BatchingChannelReader> BatchByByteSize( this ChannelReader source, - Action logAsWarning, int batchSize, bool singleReader = false, bool allowSynchronousContinuations = false @@ -16,7 +15,6 @@ public static class ChannelExtensions where T : IHasByteSize => new SizeBatchingChannelReader( source ?? throw new ArgumentNullException(nameof(source)), - logAsWarning, batchSize, singleReader, allowSynchronousContinuations diff --git a/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs b/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs index 5bb65dba..83289109 100644 --- a/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs +++ b/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs @@ -5,7 +5,7 @@ using Speckle.Sdk.Serialisation.V2.Send; namespace Speckle.Sdk.Dependencies.Serialization; -public abstract class ChannelSaver(Action logAsWarning, CancellationToken cancellationToken) +public abstract class ChannelSaver(CancellationToken cancellationToken) where T : IHasByteSize { private const int SEND_CAPACITY = 500; @@ -32,7 +32,7 @@ public abstract class ChannelSaver(Action logAsWarning, CancellationT public Task Start() => _checkCacheChannel - .Reader.BatchByByteSize(logAsWarning, HTTP_SEND_CHUNK_SIZE) + .Reader.BatchByByteSize(HTTP_SEND_CHUNK_SIZE) .WithTimeout(HTTP_BATCH_TIMEOUT) .PipeAsync( MAX_PARALLELISM_HTTP, diff --git a/src/Speckle.Sdk.Dependencies/Serialization/SizeBatchingChannelReader.cs b/src/Speckle.Sdk.Dependencies/Serialization/SizeBatchingChannelReader.cs index 5596edd4..bf09e65d 100644 --- a/src/Speckle.Sdk.Dependencies/Serialization/SizeBatchingChannelReader.cs +++ b/src/Speckle.Sdk.Dependencies/Serialization/SizeBatchingChannelReader.cs @@ -11,7 +11,6 @@ public interface IHasByteSize public sealed class SizeBatchingChannelReader( ChannelReader source, - Action logAsWarning, int batchSize, bool singleReader, bool syncCont = false @@ -34,5 +33,5 @@ public sealed class SizeBatchingChannelReader( protected override void AddBatchItem(IMemoryOwner batch, T item) => batch.AddBatchItem(item); - protected override int GetBatchSize(IMemoryOwner batch) => batch.GetBatchSize(logAsWarning, _batchSize); + protected override int GetBatchSize(IMemoryOwner batch) => batch.GetBatchSize(_batchSize); } diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs b/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs index 50fff486..8290e169 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs @@ -36,11 +36,7 @@ public sealed class SerializeProcess( CancellationToken cancellationToken, SerializeProcessOptions? options = null #pragma warning disable CS9107 -#pragma warning disable CA2254 -) - : ChannelSaver(x => loggerFactory.CreateLogger().LogWarning(x), cancellationToken), - ISerializeProcess -#pragma warning restore CA2254 +) : ChannelSaver(cancellationToken), ISerializeProcess #pragma warning restore CS9107 { //async dispose diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs index 018b4f30..bef03770 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/BatchTests.cs @@ -11,8 +11,6 @@ public class BatchTests public int ByteSize { get; } = size; } - private static readonly Action EMPTY_LOGGER = _ => { }; - [Fact] public void TestBatchSize_Calc() { @@ -23,16 +21,6 @@ public class BatchTests batch.BatchByteSize.Should().Be(3); } - [Fact] - public void Ensure_logging() - { - using var batch = new Batch(); - batch.AddBatchItem(new BatchItem(2)); - bool called = false; - batch.GetBatchSize(x => called = true, 1); - called.Should().BeTrue(); - } - [Fact] public void TestBatchSize_Trim() { @@ -75,13 +63,13 @@ public class BatchTests using var batch = BatchExtensions.CreateBatch(); batch.AddBatchItem(new BatchItem(2)); - bool full = batch.GetBatchSize(EMPTY_LOGGER, MAX_BATCH_SIZE) == MAX_BATCH_SIZE; + bool full = batch.GetBatchSize(MAX_BATCH_SIZE) == MAX_BATCH_SIZE; full.Should().BeFalse(); batch.AddBatchItem(new BatchItem(2)); - full = batch.GetBatchSize(EMPTY_LOGGER, MAX_BATCH_SIZE) == MAX_BATCH_SIZE; + full = batch.GetBatchSize(MAX_BATCH_SIZE) == MAX_BATCH_SIZE; full.Should().BeFalse(); batch.AddBatchItem(new BatchItem(2)); - full = batch.GetBatchSize(EMPTY_LOGGER, MAX_BATCH_SIZE) == MAX_BATCH_SIZE; + full = batch.GetBatchSize(MAX_BATCH_SIZE) == MAX_BATCH_SIZE; full.Should().BeTrue(); } @@ -92,7 +80,7 @@ public class BatchTests using var batch = BatchExtensions.CreateBatch(); batch.AddBatchItem(new BatchItem(63)); - bool full = batch.GetBatchSize(EMPTY_LOGGER, MAX_BATCH_SIZE) == MAX_BATCH_SIZE; + bool full = batch.GetBatchSize(MAX_BATCH_SIZE) == MAX_BATCH_SIZE; full.Should().BeTrue(); } @@ -103,10 +91,10 @@ public class BatchTests using var batch = BatchExtensions.CreateBatch(); batch.AddBatchItem(new BatchItem(2)); - bool full = batch.GetBatchSize(EMPTY_LOGGER, MAX_BATCH_SIZE) == MAX_BATCH_SIZE; + bool full = batch.GetBatchSize(MAX_BATCH_SIZE) == MAX_BATCH_SIZE; full.Should().BeFalse(); batch.AddBatchItem(new BatchItem(63)); - full = batch.GetBatchSize(EMPTY_LOGGER, MAX_BATCH_SIZE) == MAX_BATCH_SIZE; + full = batch.GetBatchSize(MAX_BATCH_SIZE) == MAX_BATCH_SIZE; full.Should().BeTrue(); } } From 062e3c2838ec23593be713809d6b07e276209273 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Mon, 7 Apr 2025 11:10:41 +0100 Subject: [PATCH 31/37] Make packs require tests too (#254) --- build/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/Program.cs b/build/Program.cs index 8a59188d..d3cd5221 100644 --- a/build/Program.cs +++ b/build/Program.cs @@ -170,7 +170,7 @@ Target( Target( PACK, - DependsOn(BUILD), + DependsOn(TEST), async () => { { From 5d07fe0ea0053cb4481fda1fec395bd9d91721f0 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Mon, 7 Apr 2025 11:49:47 +0100 Subject: [PATCH 32/37] refactor error handling to no propagate through channels. (#268) * refactor error handling to no propagate through channels. Use cancellation to shut down on exception * don't try to shutdown scheduler when exception happens...handle tokens in a tree * some cleanup * ConfigureAwait(false) again * Add test and clean up exception handling * fmt * fixed tests --- .../Serialization/ChannelSaver.cs | 23 +- .../Serialisation/V2/PriorityScheduler.cs | 10 +- .../V2/Receive/DeserializeProcess.cs | 3 +- .../Serialisation/V2/Send/SerializeProcess.cs | 230 +++++++++++++----- ...s.Cancellation_Receive_Cache.verified.json | 14 +- ...ellation_Receive_Deserialize.verified.json | 14 +- ....Cancellation_Receive_Server.verified.json | 14 +- ...sts.Cancellation_Save_Server.verified.json | 14 +- ...sts.Cancellation_Save_Sqlite.verified.json | 14 +- ...Tests.Cancellation_Serialize.verified.json | 14 +- ...nTests.Test_Exceptions_Cache.verified.json | 10 +- ...ons_Cache_ExceptionsAfter_10.verified.json | 11 + ...Receive_Cache_fileName=False.verified.json | 10 +- ..._Receive_Cache_fileName=True.verified.json | 4 +- ...st_Exceptions_Receive_Server.verified.json | 4 +- ...ons_Receive_Server_Skip_Both.verified.json | 4 +- ...Tests.Test_Exceptions_Upload.verified.json | 10 +- .../ExceptionTests.cs | 21 ++ .../Framework/ExceptionSendCacheManager.cs | 29 ++- .../Framework/AggregationExceptionScrubber.cs | 32 --- .../Framework/ExceptionScrubber.cs | 18 -- .../Framework/IdStringSerializer.cs | 24 -- tests/Speckle.Sdk.Testing/SpeckleVerify.cs | 8 +- 23 files changed, 337 insertions(+), 198 deletions(-) create mode 100644 tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Cache_ExceptionsAfter_10.verified.json delete mode 100644 tests/Speckle.Sdk.Testing/Framework/AggregationExceptionScrubber.cs delete mode 100644 tests/Speckle.Sdk.Testing/Framework/ExceptionScrubber.cs delete mode 100644 tests/Speckle.Sdk.Testing/Framework/IdStringSerializer.cs diff --git a/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs b/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs index 83289109..a43aa37d 100644 --- a/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs +++ b/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs @@ -5,7 +5,7 @@ using Speckle.Sdk.Serialisation.V2.Send; namespace Speckle.Sdk.Dependencies.Serialization; -public abstract class ChannelSaver(CancellationToken cancellationToken) +public abstract class ChannelSaver where T : IHasByteSize { private const int SEND_CAPACITY = 500; @@ -16,8 +16,6 @@ public abstract class ChannelSaver(CancellationToken cancellationToken) private const int MAX_CACHE_WRITE_PARALLELISM = 4; private const int MAX_CACHE_BATCH = 500; - private readonly CancellationTokenSource _cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); - private readonly Channel _checkCacheChannel = Channel.CreateBounded( new BoundedChannelOptions(SEND_CAPACITY) { @@ -30,7 +28,7 @@ public abstract class ChannelSaver(CancellationToken cancellationToken) _ => throw new NotImplementedException("Dropping items not supported.") ); - public Task Start() => + public Task Start(CancellationToken cancellationToken) => _checkCacheChannel .Reader.BatchByByteSize(HTTP_SEND_CHUNK_SIZE) .WithTimeout(HTTP_BATCH_TIMEOUT) @@ -39,17 +37,17 @@ public abstract class ChannelSaver(CancellationToken cancellationToken) async x => await SendToServer(x).ConfigureAwait(false), HTTP_CAPACITY, false, - _cts.Token + cancellationToken ) .Join() .Batch(MAX_CACHE_BATCH) .WithTimeout(HTTP_BATCH_TIMEOUT) - .ReadAllConcurrently(MAX_CACHE_WRITE_PARALLELISM, SaveToCache, _cts.Token) + .ReadAllConcurrently(MAX_CACHE_WRITE_PARALLELISM, SaveToCache, cancellationToken) .ContinueWith( t => { Exception? ex = t.Exception; - if (ex is null && t.Status is TaskStatus.Canceled && !_cts.Token.IsCancellationRequested) + if (ex is null && t.Status is TaskStatus.Canceled && !cancellationToken.IsCancellationRequested) { ex = new OperationCanceledException(); } @@ -60,18 +58,19 @@ public abstract class ChannelSaver(CancellationToken cancellationToken) } _checkCacheChannel.Writer.TryComplete(ex); }, - _cts.Token, + cancellationToken, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Current ); - public async ValueTask Save(T item) + public void Save(T item, CancellationToken cancellationToken) { - if (Exception is not null || _cts.IsCancellationRequested) + if (Exception is not null || cancellationToken.IsCancellationRequested) { return; //don't save if we're already done through an error } - await _checkCacheChannel.Writer.WriteAsync(item).ConfigureAwait(false); + // ReSharper disable once MethodSupportsCancellation + _checkCacheChannel.Writer.TryWrite(item); } private async Task> SendToServer(IMemoryOwner batch) @@ -124,7 +123,5 @@ public abstract class ChannelSaver(CancellationToken cancellationToken) { Exception = ex; _checkCacheChannel.Writer.TryComplete(ex); - //cancel everything! - _cts.Cancel(); } } diff --git a/src/Speckle.Sdk/Serialisation/V2/PriorityScheduler.cs b/src/Speckle.Sdk/Serialisation/V2/PriorityScheduler.cs index a1fd670a..d58c5ece 100644 --- a/src/Speckle.Sdk/Serialisation/V2/PriorityScheduler.cs +++ b/src/Speckle.Sdk/Serialisation/V2/PriorityScheduler.cs @@ -6,8 +6,7 @@ namespace Speckle.Sdk.Serialisation.V2; public sealed class PriorityScheduler( ILogger logger, ThreadPriority priority, - int maximumConcurrencyLevel, - CancellationToken cancellationToken + int maximumConcurrencyLevel ) : TaskScheduler, IAsyncDisposable { private readonly BlockingCollection _tasks = new(); @@ -56,7 +55,7 @@ public sealed class PriorityScheduler( while (true) { //we're done so leave - if (_tasks.IsCompleted || cancellationToken.IsCancellationRequested) + if (_tasks.IsCompleted) { break; } @@ -66,11 +65,6 @@ public sealed class PriorityScheduler( { break; } - //cancelled just leave - if (cancellationToken.IsCancellationRequested) - { - break; - } //didn't get a task but just timed out so continue if (!success) { diff --git a/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs b/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs index e0e62922..6a2714e0 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Receive/DeserializeProcess.cs @@ -54,8 +54,7 @@ public sealed class DeserializeProcess( private readonly PriorityScheduler _belowNormal = new( loggerFactory.CreateLogger(), ThreadPriority.BelowNormal, - Environment.ProcessorCount * 2, - cancellationToken + Environment.ProcessorCount * 2 ); private readonly DeserializeProcessOptions _options = options ?? new(); diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs b/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs index 8290e169..c8a84fb8 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs @@ -35,17 +35,20 @@ public sealed class SerializeProcess( ILoggerFactory loggerFactory, CancellationToken cancellationToken, SerializeProcessOptions? options = null -#pragma warning disable CS9107 -) : ChannelSaver(cancellationToken), ISerializeProcess -#pragma warning restore CS9107 +) : ChannelSaver, ISerializeProcess { + private static readonly Dictionary EMPTY_CLOSURES = new(); + + private readonly CancellationTokenSource _processSource = CancellationTokenSource.CreateLinkedTokenSource( + cancellationToken + ); + //async dispose [SuppressMessage("Usage", "CA2213:Disposable fields should be disposed")] private readonly PriorityScheduler _highest = new( loggerFactory.CreateLogger(), ThreadPriority.Highest, - 2, - cancellationToken + 2 ); //async dispose @@ -53,10 +56,8 @@ public sealed class SerializeProcess( private readonly PriorityScheduler _belowNormal = new( loggerFactory.CreateLogger(), ThreadPriority.BelowNormal, - Environment.ProcessorCount * 2, - cancellationToken + Environment.ProcessorCount * 2 ); - private readonly SerializeProcessOptions _options = options ?? new(); private readonly ILogger _logger = loggerFactory.CreateLogger(); @@ -81,16 +82,17 @@ public sealed class SerializeProcess( await _highest.DisposeAsync().ConfigureAwait(false); await _belowNormal.DisposeAsync().ConfigureAwait(false); sqLiteJsonCacheManager.Dispose(); + _processSource.Dispose(); } - public void ThrowIfFailed() + private void ThrowIfFailed() { - //always check for cancellation first - cancellationToken.ThrowIfCancellationRequested(); + //order here matters...null with cancellation means a user did it, otherwise it's a real Exception if (Exception is not null) { throw new SpeckleException("Error while sending", Exception); } + _processSource.Token.ThrowIfCancellationRequested(); } private async Task WaitForSchedulerCompletion() @@ -103,20 +105,21 @@ public sealed class SerializeProcess( { try { - var channelTask = Start(); + var channelTask = Start(_processSource.Token); var findTotalObjectsTask = Task.CompletedTask; if (!_options.SkipFindTotalObjects) { ThrowIfFailed(); findTotalObjectsTask = Task.Factory.StartNew( () => TraverseTotal(root), - cancellationToken, + _processSource.Token, TaskCreationOptions.AttachedToParent | TaskCreationOptions.PreferFairness, _highest ); } - await Traverse(root).ConfigureAwait(false); + await Traverse(root, _processSource.Token).ConfigureAwait(false); + ThrowIfFailed(); DoneTraversing(); await Task.WhenAll(findTotalObjectsTask, channelTask).ConfigureAwait(false); ThrowIfFailed(); @@ -135,6 +138,10 @@ public sealed class SerializeProcess( private void TraverseTotal(Base obj) { + if (_processSource.Token.IsCancellationRequested) + { + return; + } foreach (var child in baseChildFinder.GetChildren(obj)) { _objectsFound++; @@ -143,76 +150,159 @@ public sealed class SerializeProcess( } } - private async Task> Traverse(Base obj) + private async Task> Traverse(Base obj, CancellationToken token) { - var tasks = new List>>(); - foreach (var child in baseChildFinder.GetChildren(obj)) + if (token.IsCancellationRequested) { - // tmp is necessary because of the way closures close over loop variables - var tmp = child; - cancellationToken.ThrowIfCancellationRequested(); - var t = Task - .Factory.StartNew( - async () => await Traverse(tmp).ConfigureAwait(false), - cancellationToken, - TaskCreationOptions.AttachedToParent | TaskCreationOptions.PreferFairness, - _belowNormal - ) - .Unwrap(); - tasks.Add(t); + return EMPTY_CLOSURES; } - Dictionary[] taskClosures = []; - if (tasks.Count > 0) + try { - taskClosures = await Task.WhenAll(tasks).ConfigureAwait(false); - } - var childClosures = _childClosurePool.Get(); - foreach (var childClosure in taskClosures) - { - foreach (var kvp in childClosure) + var tasks = new List>>(); + using var childCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(token); + foreach (var child in baseChildFinder.GetChildren(obj)) { - childClosures[kvp.Key] = kvp.Value; - } - _currentClosurePool.Return(childClosure); - } - - var items = baseSerializer.Serialise(obj, childClosures, _options.SkipCacheRead, cancellationToken); - - var currentClosures = _currentClosurePool.Get(); - Interlocked.Increment(ref _objectCount); - progress?.Report(new(ProgressEvent.FromCacheOrSerialized, _objectCount, Math.Max(_objectCount, _objectsFound))); - foreach (var item in items) - { - if (item.NeedsStorage) - { - Interlocked.Increment(ref _objectsSerialized); - await Save(item).ConfigureAwait(false); + // tmp is necessary because of the way closures close over loop variables + var tmp = child; + if (token.IsCancellationRequested) + { + return EMPTY_CLOSURES; + } + var t = Task + .Factory.StartNew( + // ReSharper disable once AccessToDisposedClosure + // don't need to capture here + async () => await Traverse(tmp, childCancellationTokenSource.Token).ConfigureAwait(false), + childCancellationTokenSource.Token, + TaskCreationOptions.AttachedToParent | TaskCreationOptions.PreferFairness, + _belowNormal + ) + .Unwrap(); + tasks.Add(t); } - if (!currentClosures.ContainsKey(item.Id)) + if (token.IsCancellationRequested) { - currentClosures.Add(item.Id, new NodeInfo(item.Json, item.Closures)); + return EMPTY_CLOSURES; } + + List> taskClosures = new(); + if (tasks.Count > 0) + { + var currentTasks = tasks.ToList(); + do + { + //grab when any Task is done and see if we're cancelling + var t = await Task.WhenAny(currentTasks).ConfigureAwait(false); + if (t.IsCanceled) + { + return EMPTY_CLOSURES; + } + if (t.IsFaulted) + { + if (t.Exception is not null) + { + RecordException(t.Exception); + } + return EMPTY_CLOSURES; + } + taskClosures.Add(t.Result); + currentTasks.Remove(t); + } while (currentTasks.Count > 0); + } + + if (token.IsCancellationRequested) + { + return EMPTY_CLOSURES; + } + + var childClosures = _childClosurePool.Get(); + foreach (var childClosure in taskClosures) + { + foreach (var kvp in childClosure) + { + childClosures[kvp.Key] = kvp.Value; + } + + _currentClosurePool.Return(childClosure); + } + + if (token.IsCancellationRequested) + { + return EMPTY_CLOSURES; + } + + var items = baseSerializer.Serialise(obj, childClosures, _options.SkipCacheRead, token); + if (token.IsCancellationRequested) + { + return EMPTY_CLOSURES; + } + + var currentClosures = _currentClosurePool.Get(); + try + { + Interlocked.Increment(ref _objectCount); + progress?.Report(new(ProgressEvent.FromCacheOrSerialized, _objectCount, Math.Max(_objectCount, _objectsFound))); + foreach (var item in items) + { + if (item.NeedsStorage) + { + if (token.IsCancellationRequested) + { + return EMPTY_CLOSURES; + } + + Interlocked.Increment(ref _objectsSerialized); + Save(item, childCancellationTokenSource.Token); + } + + if (!currentClosures.ContainsKey(item.Id)) + { + currentClosures.Add(item.Id, new NodeInfo(item.Json, item.Closures)); + } + } + } + finally + { + _childClosurePool.Return(childClosures); + } + + return currentClosures; + } + catch (OperationCanceledException) + { + return EMPTY_CLOSURES; + } +#pragma warning disable CA1031 + catch (Exception e) +#pragma warning restore CA1031 + { + RecordException(e); + return EMPTY_CLOSURES; } - _childClosurePool.Return(childClosures); - return currentClosures; } protected override async Task SendToServerInternal(Batch batch) { + if (_processSource.IsCancellationRequested) + { + return; + } try { if (!_options.SkipServer && batch.Items.Count != 0) { var objectBatch = batch.Items.Distinct().ToList(); var hasObjects = await serverObjectManager - .HasObjects(objectBatch.Select(x => x.Id.Value).Freeze(), cancellationToken) + .HasObjects(objectBatch.Select(x => x.Id.Value).Freeze(), _processSource.Token) .ConfigureAwait(false); objectBatch = batch.Items.Where(x => !hasObjects[x.Id.Value]).ToList(); if (objectBatch.Count != 0) { - await serverObjectManager.UploadObjects(objectBatch, true, progress, cancellationToken).ConfigureAwait(false); + await serverObjectManager + .UploadObjects(objectBatch, true, progress, _processSource.Token) + .ConfigureAwait(false); Interlocked.Exchange(ref _uploaded, _uploaded + batch.Items.Count); } @@ -221,19 +311,22 @@ public sealed class SerializeProcess( } catch (OperationCanceledException) { - throw; + _processSource.Cancel(); } #pragma warning disable CA1031 catch (Exception e) #pragma warning restore CA1031 { - _logger.LogError(e, "Error sending objects to server"); - throw; + RecordException(e); } } public override void SaveToCache(List batch) { + if (_processSource.IsCancellationRequested) + { + return; + } try { if (!_options.SkipCacheWrite && batch.Count != 0) @@ -245,14 +338,21 @@ public sealed class SerializeProcess( } catch (OperationCanceledException) { - throw; + _processSource.Cancel(); } #pragma warning disable CA1031 catch (Exception e) #pragma warning restore CA1031 { - _logger.LogError(e, "Error sending objects to server"); - throw; + RecordException(e); } } + + private void RecordException(Exception e) + { + //order here matters + _logger.LogError(e, "Error in SDK"); + Exception = e; + _processSource.Cancel(); + } } diff --git a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Cache.verified.json b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Cache.verified.json index 94cd413d..cdc627d2 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Cache.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Cache.verified.json @@ -1,5 +1,15 @@ { - "Type": "System.OperationCanceledException", + "CancellationToken": { + "IsCancellationRequested": true, + "CanBeCanceled": true, + "WaitHandle": { + "SafeWaitHandle": { + "IsClosed": false, + "IsInvalid": false + } + } + }, + "Data": {}, "Message": "The operation was canceled.", - "Source": "System.Private.CoreLib" + "Type": "OperationCanceledException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Deserialize.verified.json b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Deserialize.verified.json index 94cd413d..cdc627d2 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Deserialize.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Deserialize.verified.json @@ -1,5 +1,15 @@ { - "Type": "System.OperationCanceledException", + "CancellationToken": { + "IsCancellationRequested": true, + "CanBeCanceled": true, + "WaitHandle": { + "SafeWaitHandle": { + "IsClosed": false, + "IsInvalid": false + } + } + }, + "Data": {}, "Message": "The operation was canceled.", - "Source": "System.Private.CoreLib" + "Type": "OperationCanceledException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Server.verified.json b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Server.verified.json index 94cd413d..cdc627d2 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Server.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Receive_Server.verified.json @@ -1,5 +1,15 @@ { - "Type": "System.OperationCanceledException", + "CancellationToken": { + "IsCancellationRequested": true, + "CanBeCanceled": true, + "WaitHandle": { + "SafeWaitHandle": { + "IsClosed": false, + "IsInvalid": false + } + } + }, + "Data": {}, "Message": "The operation was canceled.", - "Source": "System.Private.CoreLib" + "Type": "OperationCanceledException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Save_Server.verified.json b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Save_Server.verified.json index 94cd413d..cdc627d2 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Save_Server.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Save_Server.verified.json @@ -1,5 +1,15 @@ { - "Type": "System.OperationCanceledException", + "CancellationToken": { + "IsCancellationRequested": true, + "CanBeCanceled": true, + "WaitHandle": { + "SafeWaitHandle": { + "IsClosed": false, + "IsInvalid": false + } + } + }, + "Data": {}, "Message": "The operation was canceled.", - "Source": "System.Private.CoreLib" + "Type": "OperationCanceledException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Save_Sqlite.verified.json b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Save_Sqlite.verified.json index 94cd413d..cdc627d2 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Save_Sqlite.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Save_Sqlite.verified.json @@ -1,5 +1,15 @@ { - "Type": "System.OperationCanceledException", + "CancellationToken": { + "IsCancellationRequested": true, + "CanBeCanceled": true, + "WaitHandle": { + "SafeWaitHandle": { + "IsClosed": false, + "IsInvalid": false + } + } + }, + "Data": {}, "Message": "The operation was canceled.", - "Source": "System.Private.CoreLib" + "Type": "OperationCanceledException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Serialize.verified.json b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Serialize.verified.json index 94cd413d..cdc627d2 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Serialize.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.Cancellation_Serialize.verified.json @@ -1,5 +1,15 @@ { - "Type": "System.OperationCanceledException", + "CancellationToken": { + "IsCancellationRequested": true, + "CanBeCanceled": true, + "WaitHandle": { + "SafeWaitHandle": { + "IsClosed": false, + "IsInvalid": false + } + } + }, + "Data": {}, "Message": "The operation was canceled.", - "Source": "System.Private.CoreLib" + "Type": "OperationCanceledException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Cache.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Cache.verified.json index a4c25449..08411c1d 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Cache.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Cache.verified.json @@ -1,5 +1,11 @@ { - "Type": "Speckle.Sdk.SpeckleException", + "Data": {}, + "InnerException": { + "$type": "NotImplementedException", + "Data": {}, + "Message": "The method or operation is not implemented.", + "Type": "NotImplementedException" + }, "Message": "Error while sending", - "Source": "Speckle.Sdk" + "Type": "SpeckleException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Cache_ExceptionsAfter_10.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Cache_ExceptionsAfter_10.verified.json new file mode 100644 index 00000000..08411c1d --- /dev/null +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Cache_ExceptionsAfter_10.verified.json @@ -0,0 +1,11 @@ +{ + "Data": {}, + "InnerException": { + "$type": "NotImplementedException", + "Data": {}, + "Message": "The method or operation is not implemented.", + "Type": "NotImplementedException" + }, + "Message": "Error while sending", + "Type": "SpeckleException" +} diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Cache_fileName=False.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Cache_fileName=False.verified.json index a4c25449..08411c1d 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Cache_fileName=False.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Cache_fileName=False.verified.json @@ -1,5 +1,11 @@ { - "Type": "Speckle.Sdk.SpeckleException", + "Data": {}, + "InnerException": { + "$type": "NotImplementedException", + "Data": {}, + "Message": "The method or operation is not implemented.", + "Type": "NotImplementedException" + }, "Message": "Error while sending", - "Source": "Speckle.Sdk" + "Type": "SpeckleException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Cache_fileName=True.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Cache_fileName=True.verified.json index 1b778cf5..8a035026 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Cache_fileName=True.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Cache_fileName=True.verified.json @@ -1,5 +1,5 @@ { - "Type": "System.NotImplementedException", + "Data": {}, "Message": "The method or operation is not implemented.", - "Source": "Speckle.Sdk.Serialization.Tests" + "Type": "NotImplementedException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Server.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Server.verified.json index 1b778cf5..8a035026 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Server.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Server.verified.json @@ -1,5 +1,5 @@ { - "Type": "System.NotImplementedException", + "Data": {}, "Message": "The method or operation is not implemented.", - "Source": "Speckle.Sdk.Serialization.Tests" + "Type": "NotImplementedException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Server_Skip_Both.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Server_Skip_Both.verified.json index ec4502d8..d77dca7f 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Server_Skip_Both.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Receive_Server_Skip_Both.verified.json @@ -1,5 +1,5 @@ { - "Type": "Speckle.Sdk.SpeckleException", + "Data": {}, "Message": "Cannot skip server and cache. Please choose one.", - "Source": "Speckle.Sdk" + "Type": "SpeckleException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Upload.verified.json b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Upload.verified.json index a4c25449..08411c1d 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Upload.verified.json +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.Test_Exceptions_Upload.verified.json @@ -1,5 +1,11 @@ { - "Type": "Speckle.Sdk.SpeckleException", + "Data": {}, + "InnerException": { + "$type": "NotImplementedException", + "Data": {}, + "Message": "The method or operation is not implemented.", + "Type": "NotImplementedException" + }, "Message": "Error while sending", - "Source": "Speckle.Sdk" + "Type": "SpeckleException" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs index ff22c2b8..7a58d3d1 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs @@ -61,6 +61,27 @@ public class ExceptionTests await Verify(ex); } + [Fact] + public async Task Test_Exceptions_Cache_ExceptionsAfter_10() + { + var testClass = new TestClass() { RegularProperty = "Hello" }; + + var jsonManager = new ExceptionSendCacheManager(exceptionsAfter: 10); + await using var process2 = new SerializeProcess( + null, + jsonManager, + new DummyServerObjectManager(), + new BaseChildFinder(new BasePropertyGatherer()), + new BaseSerializer(jsonManager, new ObjectSerializerFactory(new BasePropertyGatherer())), + new NullLoggerFactory(), + default, + new SerializeProcessOptions(false, false, false, true) + ); + + var ex = await Assert.ThrowsAsync(async () => await process2.Serialize(testClass)); + await Verify(ex); + } + [Fact] public async Task Test_Exceptions_Receive_Server_Skip_Both() { diff --git a/tests/Speckle.Sdk.Serialization.Tests/Framework/ExceptionSendCacheManager.cs b/tests/Speckle.Sdk.Serialization.Tests/Framework/ExceptionSendCacheManager.cs index 0534a477..7ac6a1df 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/Framework/ExceptionSendCacheManager.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/Framework/ExceptionSendCacheManager.cs @@ -2,21 +2,40 @@ namespace Speckle.Sdk.Serialization.Tests.Framework; -public class ExceptionSendCacheManager(bool? hasObject = null) : ISqLiteJsonCacheManager +public class ExceptionSendCacheManager(bool? hasObject = null, int? exceptionsAfter = null) : ISqLiteJsonCacheManager { + private int _count; + public void Dispose() { } public IReadOnlyCollection<(string Id, string Json)> GetAllObjects() => throw new NotImplementedException(); - public void DeleteObject(string id) => throw new NotImplementedException(); + public void DeleteObject(string id) => CheckExceptions(); public string? GetObject(string id) => null; - public void SaveObject(string id, string json) => throw new NotImplementedException(); + public void SaveObject(string id, string json) => CheckExceptions(); - public void UpdateObject(string id, string json) => throw new NotImplementedException(); + public void UpdateObject(string id, string json) => CheckExceptions(); - public void SaveObjects(IEnumerable<(string id, string json)> items) => throw new NotImplementedException(); + public void SaveObjects(IEnumerable<(string id, string json)> items) => CheckExceptions(); public bool HasObject(string objectId) => hasObject ?? throw new NotImplementedException(); + + private void CheckExceptions() + { + if (exceptionsAfter is not null) + { + if (exceptionsAfter.Value > _count) + { + _count++; + } + else + { + throw new Exception("Count exceeded"); + } + } + + throw new NotImplementedException(); + } } diff --git a/tests/Speckle.Sdk.Testing/Framework/AggregationExceptionScrubber.cs b/tests/Speckle.Sdk.Testing/Framework/AggregationExceptionScrubber.cs deleted file mode 100644 index 2c96cfce..00000000 --- a/tests/Speckle.Sdk.Testing/Framework/AggregationExceptionScrubber.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Speckle.Sdk.Common; - -namespace Speckle.Sdk.Testing.Framework; - -public class AggregationExceptionScrubber : WriteOnlyJsonConverter -{ - private static readonly ExceptionScrubber _innerScrubber = new(); - - public override void Write(VerifyJsonWriter writer, AggregateException exception) - { - writer.WriteStartObject(); - - writer.WriteMember(exception, exception.GetType().FullName, "Type"); - if (exception.InnerExceptions.Count == 1) - { - writer.WritePropertyName("InnerException"); - _innerScrubber.Write(writer, exception.InnerException.NotNull()); - } - else - { - writer.WritePropertyName("InnerExceptions"); - writer.WriteStartArray(); - foreach (var innerException in exception.InnerExceptions) - { - _innerScrubber.Write(writer, innerException); - } - writer.WriteEndArray(); - } - - writer.WriteEndObject(); - } -} diff --git a/tests/Speckle.Sdk.Testing/Framework/ExceptionScrubber.cs b/tests/Speckle.Sdk.Testing/Framework/ExceptionScrubber.cs deleted file mode 100644 index 3209a6bb..00000000 --- a/tests/Speckle.Sdk.Testing/Framework/ExceptionScrubber.cs +++ /dev/null @@ -1,18 +0,0 @@ -using Argon; - -namespace Speckle.Sdk.Testing.Framework; - -public class ExceptionScrubber : WriteOnlyJsonConverter -{ - public override void Write(VerifyJsonWriter writer, Exception value) - { - var ex = new JObject - { - ["Type"] = value.GetType().FullName, - ["Message"] = value.Message, - ["Source"] = value.Source?.Trim(), - }; - //intentionally removed stacktrace to avoid errors on different machines and line numbers - writer.WriteRawValue(ex.ToString(Formatting.Indented)); - } -} diff --git a/tests/Speckle.Sdk.Testing/Framework/IdStringSerializer.cs b/tests/Speckle.Sdk.Testing/Framework/IdStringSerializer.cs deleted file mode 100644 index 5a7e7258..00000000 --- a/tests/Speckle.Sdk.Testing/Framework/IdStringSerializer.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Argon; -using Speckle.Sdk.Common; -using Speckle.Sdk.Serialisation; - -namespace Speckle.Sdk.Testing.Framework; - -[SuppressMessage("Design", "CA1062:Validate arguments of public methods")] -public class IdStringSerializer : JsonConverter -{ - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - var id = (Id)value; - writer.WriteValue(id.Value); - } - - public override object? ReadJson(JsonReader reader, Type type, object? existingValue, JsonSerializer serializer) - { - var json = reader.ReadAsString(); - return new Id(json.NotNull()); - } - - public override bool CanConvert(Type type) => typeof(Id) == type; -} diff --git a/tests/Speckle.Sdk.Testing/SpeckleVerify.cs b/tests/Speckle.Sdk.Testing/SpeckleVerify.cs index fda11211..1b076af9 100644 --- a/tests/Speckle.Sdk.Testing/SpeckleVerify.cs +++ b/tests/Speckle.Sdk.Testing/SpeckleVerify.cs @@ -25,13 +25,7 @@ public static class SpeckleVerify VerifierSettings.DontIgnoreEmptyCollections(); VerifierSettings.SortPropertiesAlphabetically(); VerifierSettings.SortJsonObjects(); - VerifierSettings.AddExtraSettings(x => - { - var existing = x.Converters.OfType>().First(); - x.Converters.Remove(existing); - x.Converters.Add(new AggregationExceptionScrubber()); - x.Converters.Add(new ExceptionScrubber()); - }); + VerifierSettings.IgnoreStackTrace(); VerifyQuibble.Initialize(); } From 630bb38b8bfa6ae3b7919cf1e9f341aea56c9a51 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Mon, 7 Apr 2025 13:43:22 +0100 Subject: [PATCH 33/37] fix: Update HostAppVersion.cs (#273) Adding v2026 for next autodesk releases support. Co-authored-by: Jonathon Broughton <760691+jsdbroughton@users.noreply.github.com> --- src/Speckle.Sdk/Host/HostAppVersion.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Speckle.Sdk/Host/HostAppVersion.cs b/src/Speckle.Sdk/Host/HostAppVersion.cs index 2dc6c540..b18b1a9f 100644 --- a/src/Speckle.Sdk/Host/HostAppVersion.cs +++ b/src/Speckle.Sdk/Host/HostAppVersion.cs @@ -13,6 +13,7 @@ public enum HostAppVersion v2023, v2024, v2025, + v2026, v21, v22, v25, From f163b2822ef7fc2c2930749e66f640c64fff5f50 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 8 Apr 2025 10:21:47 +0100 Subject: [PATCH 34/37] (feat) add memory serialize and make relevant tests use it (#252) * First pass of ObjectSaver and better in-memory usage * fix some tests * add commit to match deserialize process * correct more tests * format * make a deserialize factory * fix tests? and format * use distinct * Fix mismerge * Fix serialization issues with tests * fix merges * follow copilot suggestions * remove disables --- src/Speckle.Sdk.Dependencies/Collections.cs | 19 +++ .../Serialization/ChannelSaver.cs | 18 +-- .../Api/Operations/Operations.Receive.cs | 2 +- src/Speckle.Sdk/Api/Operations/Operations.cs | 3 +- .../V2/DeserializeProcessFactory.cs | 56 ++++++++ .../V2/DummySendServerObjectManager.cs | 68 ---------- .../V2/MemoryJsonCacheManager.cs | 37 +++++ .../V2/MemoryServerObjectManager.cs | 48 +++++++ .../Serialisation/V2/Send/ObjectSaver.cs | 126 ++++++++++++++++++ .../Serialisation/V2/Send/SerializeProcess.cs | 93 ++----------- .../V2/SerializeProcessFactory.cs | 75 ++++++----- .../Program.cs | 19 +-- .../CancellationSqLiteJsonCacheManager.cs | 9 +- .../CancellationTests.cs | 50 +++---- .../DetachedTests.cs | 63 +++++---- .../ExceptionTests.cs | 52 ++++---- .../ExplicitInterfaceTests.cs | 28 ++-- .../Framework/TestFileManager.cs | 52 ++++---- .../SerializationTests.cs | 51 +++---- .../Speckle.Sdk.Serialization.Tests.csproj | 1 + .../packages.lock.json | 9 ++ 21 files changed, 510 insertions(+), 369 deletions(-) create mode 100644 src/Speckle.Sdk/Serialisation/V2/DeserializeProcessFactory.cs delete mode 100644 src/Speckle.Sdk/Serialisation/V2/DummySendServerObjectManager.cs create mode 100644 src/Speckle.Sdk/Serialisation/V2/MemoryJsonCacheManager.cs create mode 100644 src/Speckle.Sdk/Serialisation/V2/MemoryServerObjectManager.cs create mode 100644 src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs diff --git a/src/Speckle.Sdk.Dependencies/Collections.cs b/src/Speckle.Sdk.Dependencies/Collections.cs index aa622c83..b4c910da 100644 --- a/src/Speckle.Sdk.Dependencies/Collections.cs +++ b/src/Speckle.Sdk.Dependencies/Collections.cs @@ -22,4 +22,23 @@ public static class Collections public static class EnumerableExtensions { public static IEnumerable RangeFrom(int from, int to) => Enumerable.Range(from, to - from + 1); + +#if NETSTANDARD2_0 + public static IEnumerable DistinctBy( + this IEnumerable source, + Func keySelector + ) + { + var keys = new HashSet(); + foreach (var element in source) + { + if (keys.Contains(keySelector(element))) + { + continue; + } + keys.Add(keySelector(element)); + yield return element; + } + } +#endif } diff --git a/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs b/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs index a43aa37d..b30f4608 100644 --- a/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs +++ b/src/Speckle.Sdk.Dependencies/Serialization/ChannelSaver.cs @@ -77,7 +77,7 @@ public abstract class ChannelSaver { try { - await SendToServer((Batch)batch).ConfigureAwait(false); + await SendToServerInternal((Batch)batch).ConfigureAwait(false); return batch; } #pragma warning disable CA1031 @@ -89,20 +89,6 @@ public abstract class ChannelSaver } } - public async Task SendToServer(Batch batch) - { - try - { - await SendToServerInternal(batch).ConfigureAwait(false); - } -#pragma warning disable CA1031 - catch (Exception ex) -#pragma warning restore CA1031 - { - RecordException(ex); - } - } - protected abstract Task SendToServerInternal(Batch batch); public abstract void SaveToCache(List item); @@ -117,7 +103,7 @@ public abstract class ChannelSaver } } - protected Exception? Exception { get; set; } + public Exception? Exception { get; set; } private void RecordException(Exception ex) { diff --git a/src/Speckle.Sdk/Api/Operations/Operations.Receive.cs b/src/Speckle.Sdk/Api/Operations/Operations.Receive.cs index 35aebb4a..5dcd2156 100644 --- a/src/Speckle.Sdk/Api/Operations/Operations.Receive.cs +++ b/src/Speckle.Sdk/Api/Operations/Operations.Receive.cs @@ -29,7 +29,7 @@ public partial class Operations metricsFactory.CreateCounter("Receive").Add(1); receiveActivity?.SetTag("objectId", objectId); - var process = serializeProcessFactory.CreateDeserializeProcess( + var process = deserializeProcessFactory.CreateDeserializeProcess( url, streamId, authorizationToken, diff --git a/src/Speckle.Sdk/Api/Operations/Operations.cs b/src/Speckle.Sdk/Api/Operations/Operations.cs index bb0664f8..cc5aea13 100644 --- a/src/Speckle.Sdk/Api/Operations/Operations.cs +++ b/src/Speckle.Sdk/Api/Operations/Operations.cs @@ -15,5 +15,6 @@ public partial class Operations( ILogger logger, ISdkActivityFactory activityFactory, ISdkMetricsFactory metricsFactory, - ISerializeProcessFactory serializeProcessFactory + ISerializeProcessFactory serializeProcessFactory, + IDeserializeProcessFactory deserializeProcessFactory ) : IOperations; diff --git a/src/Speckle.Sdk/Serialisation/V2/DeserializeProcessFactory.cs b/src/Speckle.Sdk/Serialisation/V2/DeserializeProcessFactory.cs new file mode 100644 index 00000000..27a6c651 --- /dev/null +++ b/src/Speckle.Sdk/Serialisation/V2/DeserializeProcessFactory.cs @@ -0,0 +1,56 @@ +using System.Collections.Concurrent; +using Microsoft.Extensions.Logging; +using Speckle.InterfaceGenerator; +using Speckle.Sdk.Serialisation.V2.Receive; +using Speckle.Sdk.SQLite; +using Speckle.Sdk.Transports; + +namespace Speckle.Sdk.Serialisation.V2; + +[GenerateAutoInterface] +public class DeserializeProcessFactory( + IBaseDeserializer baseDeserializer, + ISqLiteJsonCacheManagerFactory sqLiteJsonCacheManagerFactory, + IServerObjectManagerFactory serverObjectManagerFactory, + ILoggerFactory loggerFactory +) : IDeserializeProcessFactory +{ + public IDeserializeProcess CreateDeserializeProcess( + Uri url, + string streamId, + string? authorizationToken, + IProgress? progress, + CancellationToken cancellationToken, + DeserializeProcessOptions? options = null + ) + { + var sqLiteJsonCacheManager = sqLiteJsonCacheManagerFactory.CreateFromStream(streamId); + var serverObjectManager = serverObjectManagerFactory.Create(url, streamId, authorizationToken); + return new DeserializeProcess( + sqLiteJsonCacheManager, + serverObjectManager, + progress, + baseDeserializer, + loggerFactory, + cancellationToken, + options + ); + } + + public IDeserializeProcess CreateDeserializeProcess( + ConcurrentDictionary jsonCache, + ConcurrentDictionary objects, + IProgress? progress, + CancellationToken cancellationToken, + DeserializeProcessOptions? options = null + ) => + new DeserializeProcess( + new MemoryJsonCacheManager(jsonCache), + new MemoryServerObjectManager(objects), + progress, + baseDeserializer, + loggerFactory, + cancellationToken, + options + ); +} diff --git a/src/Speckle.Sdk/Serialisation/V2/DummySendServerObjectManager.cs b/src/Speckle.Sdk/Serialisation/V2/DummySendServerObjectManager.cs deleted file mode 100644 index 9d1c096a..00000000 --- a/src/Speckle.Sdk/Serialisation/V2/DummySendServerObjectManager.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.Text; -using Speckle.Sdk.Serialisation.V2.Send; -using Speckle.Sdk.SQLite; -using Speckle.Sdk.Transports; - -namespace Speckle.Sdk.Serialisation.V2; - -#pragma warning disable CA1063 -public class DummySqLiteJsonCacheManager : ISqLiteJsonCacheManager -#pragma warning restore CA1063 -{ -#pragma warning disable CA1816 -#pragma warning disable CA1063 - public void Dispose() { } -#pragma warning restore CA1063 -#pragma warning restore CA1816 - - public IReadOnlyCollection<(string, string)> GetAllObjects() => throw new NotImplementedException(); - - public void DeleteObject(string id) => throw new NotImplementedException(); - - public string? GetObject(string id) => null; - - public void SaveObject(string id, string json) => throw new NotImplementedException(); - - public void UpdateObject(string id, string json) => throw new NotImplementedException(); - - public virtual void SaveObjects(IEnumerable<(string id, string json)> items) => throw new NotImplementedException(); - - public bool HasObject(string objectId) => false; -} - -public class DummySendServerObjectManager : IServerObjectManager -{ - public IAsyncEnumerable<(string, string)> DownloadObjects( - IReadOnlyCollection objectIds, - IProgress? progress, - CancellationToken cancellationToken - ) => throw new NotImplementedException(); - - public Task DownloadSingleObject( - string objectId, - IProgress? progress, - CancellationToken cancellationToken - ) => throw new NotImplementedException(); - - public Task> HasObjects( - IReadOnlyCollection objectIds, - CancellationToken cancellationToken - ) => throw new NotImplementedException(); - - public Task UploadObjects( - IReadOnlyList objects, - bool compressPayloads, - IProgress? progress, - CancellationToken cancellationToken - ) - { - long totalBytes = 0; - foreach (var item in objects) - { - totalBytes += Encoding.Default.GetByteCount(item.Json.Value); - } - - progress?.Report(new(ProgressEvent.UploadBytes, totalBytes, totalBytes)); - return Task.CompletedTask; - } -} diff --git a/src/Speckle.Sdk/Serialisation/V2/MemoryJsonCacheManager.cs b/src/Speckle.Sdk/Serialisation/V2/MemoryJsonCacheManager.cs new file mode 100644 index 00000000..26e142be --- /dev/null +++ b/src/Speckle.Sdk/Serialisation/V2/MemoryJsonCacheManager.cs @@ -0,0 +1,37 @@ +using System.Collections.Concurrent; +using Speckle.Sdk.SQLite; + +namespace Speckle.Sdk.Serialisation.V2; + +#pragma warning disable CA1063 +public class MemoryJsonCacheManager(ConcurrentDictionary jsonCache) : ISqLiteJsonCacheManager +#pragma warning restore CA1063 +{ + public IReadOnlyCollection<(string Id, string Json)> GetAllObjects() => + jsonCache.Select(x => (x.Key.Value, x.Value.Value)).ToList(); + + public void DeleteObject(string id) => jsonCache.TryRemove(new Id(id), out _); + + public string? GetObject(string id) => jsonCache.TryGetValue(new Id(id), out var json) ? json.Value : null; + + public void SaveObject(string id, string json) => jsonCache.TryAdd(new Id(id), new Json(json)); + + public void UpdateObject(string id, string json) => jsonCache[new Id(id)] = new Json(json); + + public virtual void SaveObjects(IEnumerable<(string id, string json)> items) + { + foreach (var (id, json) in items) + { + SaveObject(id, json); + } + } + + public bool HasObject(string objectId) => jsonCache.ContainsKey(new Id(objectId)); + +#pragma warning disable CA1063 +#pragma warning disable CA1816 + public void Dispose() +#pragma warning restore CA1816 +#pragma warning restore CA1063 + { } +} diff --git a/src/Speckle.Sdk/Serialisation/V2/MemoryServerObjectManager.cs b/src/Speckle.Sdk/Serialisation/V2/MemoryServerObjectManager.cs new file mode 100644 index 00000000..f4dda14a --- /dev/null +++ b/src/Speckle.Sdk/Serialisation/V2/MemoryServerObjectManager.cs @@ -0,0 +1,48 @@ +using System.Collections.Concurrent; +using System.Runtime.CompilerServices; +using Speckle.Sdk.Serialisation.V2.Send; +using Speckle.Sdk.Transports; + +namespace Speckle.Sdk.Serialisation.V2; + +public class MemoryServerObjectManager(ConcurrentDictionary objects) : IServerObjectManager +{ + public virtual async IAsyncEnumerable<(string, string)> DownloadObjects( + IReadOnlyCollection objectIds, + IProgress? progress, + [EnumeratorCancellation] CancellationToken cancellationToken + ) + { + foreach (var item in objects.Where(x => objectIds.Contains(x.Key))) + { + cancellationToken.ThrowIfCancellationRequested(); + yield return (item.Key, item.Value); + } + await Task.CompletedTask.ConfigureAwait(false); + } + + public virtual Task DownloadSingleObject( + string objectId, + IProgress? progress, + CancellationToken cancellationToken + ) => Task.FromResult(objects.TryGetValue(objectId, out var json) ? json : null); + + public virtual Task> HasObjects( + IReadOnlyCollection objectIds, + CancellationToken cancellationToken + ) => Task.FromResult(objectIds.ToDictionary(x => x, objects.ContainsKey)); + + public virtual Task UploadObjects( + IReadOnlyList objectToUpload, + bool compressPayloads, + IProgress? progress, + CancellationToken cancellationToken + ) + { + foreach (BaseItem baseItem in objectToUpload) + { + objects.TryAdd(baseItem.Id.Value, baseItem.Json.Value); + } + return Task.CompletedTask; + } +} diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs b/src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs new file mode 100644 index 00000000..01c47226 --- /dev/null +++ b/src/Speckle.Sdk/Serialisation/V2/Send/ObjectSaver.cs @@ -0,0 +1,126 @@ +using Microsoft.Extensions.Logging; +using Speckle.Sdk.Dependencies; +using Speckle.Sdk.Dependencies.Serialization; +using Speckle.Sdk.SQLite; +using Speckle.Sdk.Transports; + +namespace Speckle.Sdk.Serialisation.V2.Send; + +public interface IObjectSaver : IDisposable +{ + Exception? Exception { get; set; } + Task Start(CancellationToken cancellationToken); + void DoneTraversing(); + Task DoneSaving(); + void SaveItem(BaseItem item, CancellationToken cancellationToken); +} + +public sealed class ObjectSaver( + IProgress? progress, + ISqLiteJsonCacheManager sqLiteJsonCacheManager, + IServerObjectManager serverObjectManager, + ILogger logger, + CancellationToken cancellationToken, +#pragma warning disable CS9107 +#pragma warning disable CA2254 + SerializeProcessOptions? options = null +) : ChannelSaver, IObjectSaver +#pragma warning restore CA2254 +#pragma warning restore CS9107 +{ + private readonly CancellationTokenSource _cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource( + cancellationToken + ); + + private readonly SerializeProcessOptions _options = options ?? new(); + + private long _uploaded; + private long _cached; + + private long _objectsSerialized; + + protected override async Task SendToServerInternal(Batch batch) + { + if (_cancellationTokenSource.IsCancellationRequested) + { + return; + } + try + { + if (!_options.SkipServer && batch.Items.Count != 0) + { + var objectBatch = batch.Items.Distinct().ToList(); + var hasObjects = await serverObjectManager + .HasObjects(objectBatch.Select(x => x.Id.Value).Freeze(), _cancellationTokenSource.Token) + .ConfigureAwait(false); + objectBatch = batch.Items.Where(x => !hasObjects[x.Id.Value]).ToList(); + if (objectBatch.Count != 0) + { + await serverObjectManager + .UploadObjects(objectBatch, true, progress, _cancellationTokenSource.Token) + .ConfigureAwait(false); + Interlocked.Add(ref _uploaded, batch.Items.Count); + } + + progress?.Report(new(ProgressEvent.UploadedObjects, _uploaded, null)); + } + } + catch (OperationCanceledException) + { + _cancellationTokenSource.Cancel(); + } +#pragma warning disable CA1031 + catch (Exception e) +#pragma warning restore CA1031 + { + RecordException(e); + } + } + + public void SaveItem(BaseItem item, CancellationToken cancellationToken) + { + Interlocked.Increment(ref _objectsSerialized); + Save(item, cancellationToken); + } + + public override void SaveToCache(List batch) + { + if (_cancellationTokenSource.IsCancellationRequested) + { + return; + } + try + { + if (!_options.SkipCacheWrite && batch.Count != 0) + { + sqLiteJsonCacheManager.SaveObjects(batch.Select(x => (x.Id.Value, x.Json.Value))); + Interlocked.Add(ref _cached, batch.Count); + progress?.Report(new(ProgressEvent.CachedToLocal, _cached, _objectsSerialized)); + } + } + catch (OperationCanceledException) + { + _cancellationTokenSource.Cancel(); + } +#pragma warning disable CA1031 + catch (Exception e) +#pragma warning restore CA1031 + { + RecordException(e); + } + } + + private void RecordException(Exception e) + { + //order here matters + logger.LogError(e, "Error in SDK"); + Exception = e; + _cancellationTokenSource.Cancel(); + } + + public void Dispose() + { + _cancellationTokenSource.Dispose(); + sqLiteJsonCacheManager.Dispose(); + } +} diff --git a/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs b/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs index c8a84fb8..df27e577 100644 --- a/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs +++ b/src/Speckle.Sdk/Serialisation/V2/Send/SerializeProcess.cs @@ -4,9 +4,7 @@ using Microsoft.Extensions.Logging; using Speckle.InterfaceGenerator; using Speckle.Sdk.Common; using Speckle.Sdk.Dependencies; -using Speckle.Sdk.Dependencies.Serialization; using Speckle.Sdk.Models; -using Speckle.Sdk.SQLite; using Speckle.Sdk.Transports; namespace Speckle.Sdk.Serialisation.V2.Send; @@ -28,20 +26,20 @@ public partial interface ISerializeProcess : IAsyncDisposable; [GenerateAutoInterface] public sealed class SerializeProcess( IProgress? progress, - ISqLiteJsonCacheManager sqLiteJsonCacheManager, - IServerObjectManager serverObjectManager, + IObjectSaver objectSaver, IBaseChildFinder baseChildFinder, IBaseSerializer baseSerializer, ILoggerFactory loggerFactory, CancellationToken cancellationToken, SerializeProcessOptions? options = null -) : ChannelSaver, ISerializeProcess +) : ISerializeProcess { private static readonly Dictionary EMPTY_CLOSURES = new(); private readonly CancellationTokenSource _processSource = CancellationTokenSource.CreateLinkedTokenSource( cancellationToken ); + private readonly ILogger _logger = loggerFactory.CreateLogger(); //async dispose [SuppressMessage("Usage", "CA2213:Disposable fields should be disposed")] @@ -59,7 +57,6 @@ public sealed class SerializeProcess( Environment.ProcessorCount * 2 ); private readonly SerializeProcessOptions _options = options ?? new(); - private readonly ILogger _logger = loggerFactory.CreateLogger(); private readonly Pool> _currentClosurePool = Pools.CreateDictionaryPool(); private readonly Pool> _childClosurePool = Pools.CreateConcurrentDictionaryPool< @@ -72,25 +69,22 @@ public sealed class SerializeProcess( private long _objectsSerialized; - private long _uploaded; - private long _cached; - [AutoInterfaceIgnore] public async ValueTask DisposeAsync() { await WaitForSchedulerCompletion().ConfigureAwait(false); await _highest.DisposeAsync().ConfigureAwait(false); await _belowNormal.DisposeAsync().ConfigureAwait(false); - sqLiteJsonCacheManager.Dispose(); + objectSaver.Dispose(); _processSource.Dispose(); } private void ThrowIfFailed() { //order here matters...null with cancellation means a user did it, otherwise it's a real Exception - if (Exception is not null) + if (objectSaver.Exception is not null) { - throw new SpeckleException("Error while sending", Exception); + throw new SpeckleException("Error while sending", objectSaver.Exception); } _processSource.Token.ThrowIfCancellationRequested(); } @@ -105,7 +99,7 @@ public sealed class SerializeProcess( { try { - var channelTask = Start(_processSource.Token); + var channelTask = objectSaver.Start(_processSource.Token); var findTotalObjectsTask = Task.CompletedTask; if (!_options.SkipFindTotalObjects) { @@ -120,10 +114,10 @@ public sealed class SerializeProcess( await Traverse(root, _processSource.Token).ConfigureAwait(false); ThrowIfFailed(); - DoneTraversing(); + objectSaver.DoneTraversing(); await Task.WhenAll(findTotalObjectsTask, channelTask).ConfigureAwait(false); ThrowIfFailed(); - await DoneSaving().ConfigureAwait(false); + await objectSaver.DoneSaving().ConfigureAwait(false); ThrowIfFailed(); await WaitForSchedulerCompletion().ConfigureAwait(false); ThrowIfFailed(); @@ -254,7 +248,7 @@ public sealed class SerializeProcess( } Interlocked.Increment(ref _objectsSerialized); - Save(item, childCancellationTokenSource.Token); + objectSaver.SaveItem(item, childCancellationTokenSource.Token); } if (!currentClosures.ContainsKey(item.Id)) @@ -283,76 +277,11 @@ public sealed class SerializeProcess( } } - protected override async Task SendToServerInternal(Batch batch) - { - if (_processSource.IsCancellationRequested) - { - return; - } - try - { - if (!_options.SkipServer && batch.Items.Count != 0) - { - var objectBatch = batch.Items.Distinct().ToList(); - var hasObjects = await serverObjectManager - .HasObjects(objectBatch.Select(x => x.Id.Value).Freeze(), _processSource.Token) - .ConfigureAwait(false); - objectBatch = batch.Items.Where(x => !hasObjects[x.Id.Value]).ToList(); - if (objectBatch.Count != 0) - { - await serverObjectManager - .UploadObjects(objectBatch, true, progress, _processSource.Token) - .ConfigureAwait(false); - Interlocked.Exchange(ref _uploaded, _uploaded + batch.Items.Count); - } - - progress?.Report(new(ProgressEvent.UploadedObjects, _uploaded, null)); - } - } - catch (OperationCanceledException) - { - _processSource.Cancel(); - } -#pragma warning disable CA1031 - catch (Exception e) -#pragma warning restore CA1031 - { - RecordException(e); - } - } - - public override void SaveToCache(List batch) - { - if (_processSource.IsCancellationRequested) - { - return; - } - try - { - if (!_options.SkipCacheWrite && batch.Count != 0) - { - sqLiteJsonCacheManager.SaveObjects(batch.Select(x => (x.Id.Value, x.Json.Value))); - Interlocked.Exchange(ref _cached, _cached + batch.Count); - progress?.Report(new(ProgressEvent.CachedToLocal, _cached, _objectsSerialized)); - } - } - catch (OperationCanceledException) - { - _processSource.Cancel(); - } -#pragma warning disable CA1031 - catch (Exception e) -#pragma warning restore CA1031 - { - RecordException(e); - } - } - private void RecordException(Exception e) { //order here matters _logger.LogError(e, "Error in SDK"); - Exception = e; + objectSaver.Exception = e; _processSource.Cancel(); } } diff --git a/src/Speckle.Sdk/Serialisation/V2/SerializeProcessFactory.cs b/src/Speckle.Sdk/Serialisation/V2/SerializeProcessFactory.cs index 863d7026..550cfa4b 100644 --- a/src/Speckle.Sdk/Serialisation/V2/SerializeProcessFactory.cs +++ b/src/Speckle.Sdk/Serialisation/V2/SerializeProcessFactory.cs @@ -1,35 +1,16 @@ +using System.Collections.Concurrent; using Microsoft.Extensions.Logging; -using Speckle.Sdk.Serialisation.V2.Receive; +using Speckle.InterfaceGenerator; using Speckle.Sdk.Serialisation.V2.Send; using Speckle.Sdk.SQLite; using Speckle.Sdk.Transports; namespace Speckle.Sdk.Serialisation.V2; -public interface ISerializeProcessFactory -{ - ISerializeProcess CreateSerializeProcess( - Uri url, - string streamId, - string? authorizationToken, - IProgress? progress, - CancellationToken cancellationToken, - SerializeProcessOptions? options = null - ); - IDeserializeProcess CreateDeserializeProcess( - Uri url, - string streamId, - string? authorizationToken, - IProgress? progress, - CancellationToken cancellationToken, - DeserializeProcessOptions? options = null - ); -} - +[GenerateAutoInterface] public class SerializeProcessFactory( IBaseChildFinder baseChildFinder, IObjectSerializerFactory objectSerializerFactory, - IBaseDeserializer baseDeserializer, ISqLiteJsonCacheManagerFactory sqLiteJsonCacheManagerFactory, IServerObjectManagerFactory serverObjectManagerFactory, ILoggerFactory loggerFactory @@ -46,34 +27,54 @@ public class SerializeProcessFactory( { var sqLiteJsonCacheManager = sqLiteJsonCacheManagerFactory.CreateFromStream(streamId); var serverObjectManager = serverObjectManagerFactory.Create(url, streamId, authorizationToken); - return new SerializeProcess( + return CreateSerializeProcess(sqLiteJsonCacheManager, serverObjectManager, progress, cancellationToken, options); + } + + public ISerializeProcess CreateSerializeProcess( + ISqLiteJsonCacheManager sqLiteJsonCacheManager, + IServerObjectManager serverObjectManager, + IProgress? progress, + CancellationToken cancellationToken, + SerializeProcessOptions? options = null + ) => + new SerializeProcess( progress, - sqLiteJsonCacheManager, - serverObjectManager, + new ObjectSaver( + progress, + sqLiteJsonCacheManager, + serverObjectManager, + loggerFactory.CreateLogger(), + cancellationToken + ), baseChildFinder, new BaseSerializer(sqLiteJsonCacheManager, objectSerializerFactory), loggerFactory, cancellationToken, options ); - } - public IDeserializeProcess CreateDeserializeProcess( - Uri url, - string streamId, - string? authorizationToken, + public ISerializeProcess CreateSerializeProcess( + ConcurrentDictionary jsonCache, + ConcurrentDictionary objects, IProgress? progress, CancellationToken cancellationToken, - DeserializeProcessOptions? options = null + SerializeProcessOptions? options = null ) { - var sqLiteJsonCacheManager = sqLiteJsonCacheManagerFactory.CreateFromStream(streamId); - var serverObjectManager = serverObjectManagerFactory.Create(url, streamId, authorizationToken); - return new DeserializeProcess( - sqLiteJsonCacheManager, - serverObjectManager, +#pragma warning disable CA2000 + var memoryJsonCacheManager = new MemoryJsonCacheManager(jsonCache); +#pragma warning restore CA2000 + return new SerializeProcess( progress, - baseDeserializer, + new ObjectSaver( + progress, + memoryJsonCacheManager, + new MemoryServerObjectManager(objects), + loggerFactory.CreateLogger(), + cancellationToken + ), + baseChildFinder, + new BaseSerializer(memoryJsonCacheManager, objectSerializerFactory), loggerFactory, cancellationToken, options diff --git a/tests/Speckle.Sdk.Serialization.Testing/Program.cs b/tests/Speckle.Sdk.Serialization.Testing/Program.cs index 51b285eb..ca7a9d92 100644 --- a/tests/Speckle.Sdk.Serialization.Testing/Program.cs +++ b/tests/Speckle.Sdk.Serialization.Testing/Program.cs @@ -1,16 +1,13 @@ #pragma warning disable CA1506 using System.Reflection; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging.Abstractions; using Speckle.Sdk; using Speckle.Sdk.Credentials; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation.V2; -using Speckle.Sdk.Serialisation.V2.Receive; using Speckle.Sdk.Serialisation.V2.Send; using Speckle.Sdk.Serialization.Testing; -using Speckle.Sdk.SQLite; const bool skipCacheReceive = false; const bool skipCacheSendCheck = true; @@ -41,21 +38,15 @@ Console.WriteLine("Attach"); var token = serviceProvider.GetRequiredService().GetDefaultAccount()?.token; var progress = new Progress(true); -var factory = new SerializeProcessFactory( - new BaseChildFinder(new BasePropertyGatherer()), - new ObjectSerializerFactory(new BasePropertyGatherer()), - new BaseDeserializer(new ObjectDeserializerFactory()), - serviceProvider.GetRequiredService(), - serviceProvider.GetRequiredService(), - new NullLoggerFactory() -); +var factory = serviceProvider.GetRequiredService(); var process = factory.CreateDeserializeProcess(new Uri(url), streamId, token, progress, default, new(skipCacheReceive)); var @base = await process.Deserialize(rootId).ConfigureAwait(false); Console.WriteLine("Deserialized"); Console.ReadLine(); Console.WriteLine("Executing"); -var process2 = factory.CreateSerializeProcess( +var serializeProcessFactory = serviceProvider.GetRequiredService(); +var serializeProcess = serializeProcessFactory.CreateSerializeProcess( new Uri(url), streamId, token, @@ -63,8 +54,8 @@ var process2 = factory.CreateSerializeProcess( default, new SerializeProcessOptions(skipCacheSendCheck, skipCacheSendSave, true, true) ); -await process2.Serialize(@base).ConfigureAwait(false); +await serializeProcess.Serialize(@base).ConfigureAwait(false); Console.WriteLine("Detach"); Console.ReadLine(); -await process2.DisposeAsync().ConfigureAwait(false); +await serializeProcess.DisposeAsync().ConfigureAwait(false); #pragma warning restore CA1506 diff --git a/tests/Speckle.Sdk.Serialization.Tests/CancellationSqLiteJsonCacheManager.cs b/tests/Speckle.Sdk.Serialization.Tests/CancellationSqLiteJsonCacheManager.cs index c4d8d355..bbe6b8b1 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/CancellationSqLiteJsonCacheManager.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/CancellationSqLiteJsonCacheManager.cs @@ -1,4 +1,6 @@ -using Speckle.Sdk.Serialisation.V2; +using System.Collections.Concurrent; +using Speckle.Sdk.Serialisation; +using Speckle.Sdk.Serialisation.V2; using Speckle.Sdk.Serialisation.V2.Send; using Speckle.Sdk.Testing.Framework; using Speckle.Sdk.Transports; @@ -6,7 +8,7 @@ using Speckle.Sdk.Transports; namespace Speckle.Sdk.Serialization.Tests; public sealed class CancellationSqLiteJsonCacheManager(CancellationTokenSource cancellationTokenSource) - : DummySqLiteJsonCacheManager + : MemoryJsonCacheManager(new ConcurrentDictionary()) { public override void SaveObjects(IEnumerable<(string id, string json)> items) { @@ -24,7 +26,8 @@ public class CancellationSqLiteSendManager(CancellationTokenSource cancellationT } } -public class CancellationServerObjectManager(CancellationTokenSource cancellationTokenSource) : DummyServerObjectManager +public class CancellationServerObjectManager(CancellationTokenSource cancellationTokenSource) + : MemoryServerObjectManager(new ConcurrentDictionary()) { public override Task UploadObjects( IReadOnlyList objects, diff --git a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.cs b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.cs index 5e2995a0..fba0327b 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.cs @@ -1,10 +1,12 @@ using System.Collections.Concurrent; using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Abstractions; using Speckle.Objects.Geometry; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; +using Speckle.Sdk.Serialisation.V2; using Speckle.Sdk.Serialisation.V2.Receive; using Speckle.Sdk.Serialisation.V2.Send; using Speckle.Sdk.Serialization.Tests.Framework; @@ -14,10 +16,18 @@ namespace Speckle.Sdk.Serialization.Tests; public class CancellationTests { + private readonly ISerializeProcessFactory _factory; + public CancellationTests() { TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Base).Assembly, typeof(DetachedTests).Assembly, typeof(Polyline).Assembly); + TypeLoader.Initialize(typeof(Base).Assembly, typeof(TestClass).Assembly, typeof(Polyline).Assembly); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + var serviceProvider = serviceCollection.BuildServiceProvider(); + + _factory = serviceProvider.GetRequiredService(); } [Fact] @@ -26,13 +36,11 @@ public class CancellationTests var testClass = new TestClass() { RegularProperty = "Hello" }; using var cancellationSource = new CancellationTokenSource(); - await using var serializeProcess = new SerializeProcess( + + await using var serializeProcess = _factory.CreateSerializeProcess( + new ConcurrentDictionary(), + new ConcurrentDictionary(), null, - new DummySqLiteSendManager(), - new DummyServerObjectManager(), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new DummySqLiteSendManager(), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), cancellationSource.Token, new SerializeProcessOptions(true, true, false, true) ); @@ -50,15 +58,13 @@ public class CancellationTests var testClass = new TestClass() { RegularProperty = "Hello" }; using var cancellationSource = new CancellationTokenSource(); - await using var serializeProcess = new SerializeProcess( - null, + + await using var serializeProcess = _factory.CreateSerializeProcess( new DummySqLiteSendManager(), new CancellationServerObjectManager(cancellationSource), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new DummySqLiteSendManager(), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), + null, cancellationSource.Token, - new SerializeProcessOptions(true, false, false, true) + new SerializeProcessOptions(true, true, false, true) ); var ex = await Assert.ThrowsAsync( async () => await serializeProcess.Serialize(testClass) @@ -73,16 +79,14 @@ public class CancellationTests var testClass = new TestClass() { RegularProperty = "Hello" }; using var cancellationSource = new CancellationTokenSource(); - await using var serializeProcess = new SerializeProcess( + await using var serializeProcess = _factory.CreateSerializeProcess( + new DummySqLiteSendManager(), + new CancellationServerObjectManager(cancellationSource), null, - new CancellationSqLiteSendManager(cancellationSource), - new DummyServerObjectManager(), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new DummySqLiteSendManager(), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), cancellationSource.Token, - new SerializeProcessOptions(true, false, false, true) + new SerializeProcessOptions(true, true, false, true) ); + var ex = await Assert.ThrowsAsync( async () => await serializeProcess.Serialize(testClass) ); @@ -94,7 +98,7 @@ public class CancellationTests [InlineData("RevitObject.json.gz", "3416d3fe01c9196115514c4a2f41617b", 7818)] public async Task Cancellation_Receive_Cache(string fileName, string rootId, int oldCount) { - var closures = await TestFileManager.GetFileAsClosures(fileName); + var closures = TestFileManager.GetFileAsClosures(fileName); closures.Count.Should().Be(oldCount); using var cancellationSource = new CancellationTokenSource(); @@ -121,7 +125,7 @@ public class CancellationTests [InlineData("RevitObject.json.gz", "3416d3fe01c9196115514c4a2f41617b", 7818)] public async Task Cancellation_Receive_Server(string fileName, string rootId, int oldCount) { - var closures = await TestFileManager.GetFileAsClosures(fileName); + var closures = TestFileManager.GetFileAsClosures(fileName); closures.Count.Should().Be(oldCount); using var cancellationSource = new CancellationTokenSource(); @@ -148,7 +152,7 @@ public class CancellationTests [InlineData("RevitObject.json.gz", "3416d3fe01c9196115514c4a2f41617b", 7818)] public async Task Cancellation_Receive_Deserialize(string fileName, string rootId, int oldCount) { - var closures = await TestFileManager.GetFileAsClosures(fileName); + var closures = TestFileManager.GetFileAsClosures(fileName); closures.Count.Should().Be(oldCount); using var cancellationSource = new CancellationTokenSource(); diff --git a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs index add4126d..ce06d3cc 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs @@ -1,7 +1,7 @@ using System.Collections.Concurrent; using System.Text; using FluentAssertions; -using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.DependencyInjection; using Speckle.Newtonsoft.Json.Linq; using Speckle.Objects.Geometry; using Speckle.Sdk.Host; @@ -16,10 +16,18 @@ namespace Speckle.Sdk.Serialization.Tests; public class DetachedTests { + private readonly ISerializeProcessFactory _factory; + public DetachedTests() { TypeLoader.Reset(); TypeLoader.Initialize(typeof(Base).Assembly, typeof(DetachedTests).Assembly, typeof(Polyline).Assembly); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + var serviceProvider = serviceCollection.BuildServiceProvider(); + + _factory = serviceProvider.GetRequiredService(); } [Fact] @@ -30,19 +38,16 @@ public class DetachedTests @base.detachedProp = new SamplePropBase() { name = "detachedProp" }; @base.attachedProp = new SamplePropBase() { name = "attachedProp" }; - var objects = new Dictionary(); + var objects = new ConcurrentDictionary(); - await using var process2 = new SerializeProcess( + await using var serializeProcess = _factory.CreateSerializeProcess( + new ConcurrentDictionary(), + objects, null, - new DummySendCacheManager(objects), - new DummyServerObjectManager(), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), default, new SerializeProcessOptions(false, false, true, true) ); - await process2.Serialize(@base); + await serializeProcess.Serialize(@base); await VerifyJsonDictionary(objects); } @@ -115,19 +120,16 @@ public class DetachedTests line = new Polyline() { units = "test", value = [3.0, 4.0] }, }; - var objects = new Dictionary(); + var objects = new ConcurrentDictionary(); - await using var process2 = new SerializeProcess( + await using var serializeProcess = _factory.CreateSerializeProcess( + new ConcurrentDictionary(), + objects, null, - new DummySendCacheManager(objects), - new DummyServerObjectManager(), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), default, new SerializeProcessOptions(false, false, true, true) ); - var results = await process2.Serialize(@base); + var results = await serializeProcess.Serialize(@base); await VerifyJsonDictionary(objects); } @@ -185,19 +187,17 @@ public class DetachedTests @base.list = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; @base.list2 = new List() { 1, 10 }; - var objects = new Dictionary(); + var objects = new ConcurrentDictionary(); - await using var process2 = new SerializeProcess( + await using var serializeProcess = _factory.CreateSerializeProcess( + new ConcurrentDictionary(), + objects, null, - new DummySendCacheManager(objects), - new DummyServerObjectManager(), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), default, new SerializeProcessOptions(false, false, true, true) ); - var results = await process2.Serialize(@base); + + var results = await serializeProcess.Serialize(@base); objects.Count.Should().Be(3); var x = JObject.Parse(objects["efeadaca70a85ae6d3acfc93a8b380db"]); @@ -220,19 +220,16 @@ public class DetachedTests @base.list2 = new List() { 1, 10 }; @base.arr = [1, 10]; - var objects = new Dictionary(); + var objects = new ConcurrentDictionary(); - await using var process2 = new SerializeProcess( + await using var serializeProcess = _factory.CreateSerializeProcess( + new ConcurrentDictionary(), + objects, null, - new DummySendCacheManager(objects), - new DummyServerObjectManager(), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), default, new SerializeProcessOptions(false, false, true, true) ); - var results = await process2.Serialize(@base); + var results = await serializeProcess.Serialize(@base); await VerifyJsonDictionary(objects); } } diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs index 7a58d3d1..d31b80d1 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs @@ -1,9 +1,12 @@ +using System.Collections.Concurrent; using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Abstractions; using Speckle.Objects.Geometry; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; +using Speckle.Sdk.Serialisation.V2; using Speckle.Sdk.Serialisation.V2.Receive; using Speckle.Sdk.Serialisation.V2.Send; using Speckle.Sdk.Serialization.Tests.Framework; @@ -13,10 +16,18 @@ namespace Speckle.Sdk.Serialization.Tests; public class ExceptionTests { + private readonly ISerializeProcessFactory _factory; + public ExceptionTests() { TypeLoader.Reset(); TypeLoader.Initialize(typeof(Base).Assembly, typeof(DetachedTests).Assembly, typeof(Polyline).Assembly); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + var serviceProvider = serviceCollection.BuildServiceProvider(); + + _factory = serviceProvider.GetRequiredService(); } [Fact] @@ -24,20 +35,18 @@ public class ExceptionTests { var testClass = new TestClass() { RegularProperty = "Hello" }; - var objects = new Dictionary(); - await using var process2 = new SerializeProcess( - null, - new DummySendCacheManager(objects), + var objects = new ConcurrentDictionary(); + + await using var serializeProcess = _factory.CreateSerializeProcess( + new MemoryJsonCacheManager(objects), new ExceptionServerObjectManager(), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), + null, default, new SerializeProcessOptions(false, false, false, true) ); //4 exceptions are fine because we use 4 threads for saving cache - var ex = await Assert.ThrowsAsync(async () => await process2.Serialize(testClass)); + var ex = await Assert.ThrowsAsync(async () => await serializeProcess.Serialize(testClass)); await Verify(ex); } @@ -46,18 +55,15 @@ public class ExceptionTests { var testClass = new TestClass() { RegularProperty = "Hello" }; - await using var process2 = new SerializeProcess( - null, + await using var serializeProcess = _factory.CreateSerializeProcess( new ExceptionSendCacheManager(), - new DummyServerObjectManager(), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new ExceptionSendCacheManager(), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), + new MemoryServerObjectManager(new()), + null, default, new SerializeProcessOptions(false, false, false, true) ); - var ex = await Assert.ThrowsAsync(async () => await process2.Serialize(testClass)); + var ex = await Assert.ThrowsAsync(async () => await serializeProcess.Serialize(testClass)); await Verify(ex); } @@ -66,19 +72,15 @@ public class ExceptionTests { var testClass = new TestClass() { RegularProperty = "Hello" }; - var jsonManager = new ExceptionSendCacheManager(exceptionsAfter: 10); - await using var process2 = new SerializeProcess( + await using var serializeProcess = _factory.CreateSerializeProcess( + new ExceptionSendCacheManager(exceptionsAfter: 10), + new MemoryServerObjectManager(new()), null, - jsonManager, - new DummyServerObjectManager(), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(jsonManager, new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), default, new SerializeProcessOptions(false, false, false, true) ); - var ex = await Assert.ThrowsAsync(async () => await process2.Serialize(testClass)); + var ex = await Assert.ThrowsAsync(async () => await serializeProcess.Serialize(testClass)); await Verify(ex); } @@ -111,7 +113,7 @@ public class ExceptionTests [InlineData("RevitObject.json.gz", "3416d3fe01c9196115514c4a2f41617b", 7818)] public async Task Test_Exceptions_Receive_Server(string fileName, string rootId, int oldCount) { - var closures = await TestFileManager.GetFileAsClosures(fileName); + var closures = TestFileManager.GetFileAsClosures(fileName); closures.Count.Should().Be(oldCount); await using var process = new DeserializeProcess( @@ -136,7 +138,7 @@ public class ExceptionTests [InlineData("RevitObject.json.gz", "3416d3fe01c9196115514c4a2f41617b", 7818, true)] public async Task Test_Exceptions_Receive_Cache(string fileName, string rootId, int oldCount, bool? hasObject) { - var closures = await TestFileManager.GetFileAsClosures(fileName); + var closures = TestFileManager.GetFileAsClosures(fileName); closures.Count.Should().Be(oldCount); await using var process = new DeserializeProcess( diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs index 0bd05a14..dc46b582 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs @@ -1,16 +1,27 @@ -using Microsoft.Extensions.Logging.Abstractions; +using System.Collections.Concurrent; +using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Host; using Speckle.Sdk.Models; +using Speckle.Sdk.Serialisation; +using Speckle.Sdk.Serialisation.V2; using Speckle.Sdk.Serialisation.V2.Send; namespace Speckle.Sdk.Serialization.Tests; public class ExplicitInterfaceTests { + private readonly ISerializeProcessFactory _factory; + public ExplicitInterfaceTests() { TypeLoader.Reset(); TypeLoader.Initialize(typeof(Base).Assembly, typeof(TestClass).Assembly); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + var serviceProvider = serviceCollection.BuildServiceProvider(); + + _factory = serviceProvider.GetRequiredService(); } [Fact] @@ -18,19 +29,16 @@ public class ExplicitInterfaceTests { var testClass = new TestClass() { RegularProperty = "Hello" }; - var objects = new Dictionary(); - await using var process2 = new SerializeProcess( + var objects = new ConcurrentDictionary(); + await using var serializeProcess = _factory.CreateSerializeProcess( + new ConcurrentDictionary(), + objects, null, - new DummySendCacheManager(objects), - new DummyServerObjectManager(), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new DummySendCacheManager(objects), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), default, - new SerializeProcessOptions(false, false, true, true) + new SerializeProcessOptions(true, true, false, true) ); - await process2.Serialize(testClass); + await serializeProcess.Serialize(testClass); await VerifyJsonDictionary(objects); } diff --git a/tests/Speckle.Sdk.Serialization.Tests/Framework/TestFileManager.cs b/tests/Speckle.Sdk.Serialization.Tests/Framework/TestFileManager.cs index 34b738e1..a07f05c2 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/Framework/TestFileManager.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/Framework/TestFileManager.cs @@ -1,7 +1,8 @@ -using System.IO.Compression; +using System.Collections.Concurrent; +using System.IO.Compression; using System.Reflection; using Speckle.Newtonsoft.Json.Linq; -using Speckle.Objects.Data; +using Speckle.Objects.Geometry; using Speckle.Sdk.Common; using Speckle.Sdk.Host; using Speckle.Sdk.Models; @@ -10,49 +11,50 @@ namespace Speckle.Sdk.Serialization.Tests.Framework; public static class TestFileManager { - static TestFileManager() - { - TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Base).Assembly, typeof(DataObject).Assembly, _assembly); - } + private static readonly Assembly s_assembly = Assembly.GetExecutingAssembly(); //test + private static readonly Assembly s_speckleAssembly = typeof(Base).Assembly; //speckle.sdk + private static readonly Assembly s_speckleObjectsAssembly = typeof(Polyline).Assembly; //speckle.sdk + private static readonly Dictionary> s_objects = new(); - private static readonly Assembly _assembly = Assembly.GetExecutingAssembly(); - private static readonly Dictionary> _objects = new(); - - public static async Task> GetFileAsClosures(string fileName) + public static IReadOnlyDictionary GetFileAsClosures(string fileName) { - if (!_objects.TryGetValue(fileName, out var closure)) + lock (s_objects) { - var fullName = _assembly.GetManifestResourceNames().Single(x => x.EndsWith(fileName)); - var json = await ReadJson(fullName); - closure = ReadAsObjects(json); - _objects.Add(fileName, closure); + if (!s_objects.TryGetValue(fileName, out var closure)) + { + TypeLoader.Reset(); + TypeLoader.Initialize(s_assembly, s_speckleAssembly, s_speckleObjectsAssembly); + var fullName = s_assembly.GetManifestResourceNames().Single(x => x.EndsWith(fileName)); + var json = ReadJson(fullName); + closure = ReadAsObjects(json); + s_objects.Add(fileName, closure); + } + return closure; } - return closure; } - private static async Task ReadJson(string fullName) + private static string ReadJson(string fullName) { - await using var stream = _assembly.GetManifestResourceStream(fullName).NotNull(); + using var stream = s_assembly.GetManifestResourceStream(fullName).NotNull(); if (fullName.EndsWith(".gz")) { - await using var z = new GZipStream(stream, CompressionMode.Decompress); + using var z = new GZipStream(stream, CompressionMode.Decompress); using var reader2 = new StreamReader(z); - return await reader2.ReadToEndAsync(); + return reader2.ReadToEnd(); } using var reader = new StreamReader(stream); - return await reader.ReadToEndAsync(); + return reader.ReadToEnd(); } - private static Dictionary ReadAsObjects(string json) + private static ConcurrentDictionary ReadAsObjects(string json) { - var jsonObjects = new Dictionary(); + var jsonObjects = new ConcurrentDictionary(); var array = JArray.Parse(json); foreach (var obj in array) { if (obj is JObject jobj) { - jsonObjects.Add(jobj["id"].NotNull().Value().NotNull(), jobj.ToString()); + jsonObjects.TryAdd(jobj["id"].NotNull().Value().NotNull(), jobj.ToString()); } } return jsonObjects; diff --git a/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs b/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs index 64db5cb9..64c77603 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs @@ -1,13 +1,16 @@ using System.Collections.Concurrent; using FluentAssertions; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Abstractions; using Speckle.Newtonsoft.Json; using Speckle.Newtonsoft.Json.Linq; +using Speckle.Objects.Geometry; using Speckle.Sdk.Common; using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Serialisation.Utilities; +using Speckle.Sdk.Serialisation.V2; using Speckle.Sdk.Serialisation.V2.Receive; using Speckle.Sdk.Serialisation.V2.Send; using Speckle.Sdk.Serialization.Tests.Framework; @@ -17,32 +20,20 @@ namespace Speckle.Sdk.Serialization.Tests; public class SerializationTests { - private class TestLoader(string json) : IObjectLoader + private readonly ISerializeProcessFactory _factory; + + public SerializationTests() { - public Task<(Json, IReadOnlyCollection)> GetAndCache(string rootId, DeserializeProcessOptions? options) - { - var childrenIds = ClosureParser.GetChildrenIds(new(json), default).Select(x => new Id(x)).ToList(); - return Task.FromResult<(Json, IReadOnlyCollection)>((new(json), childrenIds)); - } + TypeLoader.Reset(); + TypeLoader.Initialize(typeof(Base).Assembly, typeof(Mesh).Assembly, typeof(TestClass).Assembly); - public string? LoadId(string id) => null; + var serviceCollection = new ServiceCollection(); + serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + var serviceProvider = serviceCollection.BuildServiceProvider(); - public void Dispose() { } + _factory = serviceProvider.GetRequiredService(); } - /* - [Test] - [TestCase("RevitObject.json")] - public async Task RunTest2(string fileName) - { - var fullName = _assembly.GetManifestResourceNames().Single(x => x.EndsWith(fileName)); - var json = await ReadJson(fullName); - var closure = await ReadAsObjects(json); - using DeserializeProcess sut = new(null, new TestLoader(json), new TestTransport(closure)); - var @base = await sut.Deserialize("551513ff4f3596024547fc818f1f3f70"); - @base.Should().NotBeNull(); - }*/ - public class TestObjectLoader(IReadOnlyDictionary idToObject) : IObjectLoader { public Task<(Json, IReadOnlyCollection)> GetAndCache(string rootId, DeserializeProcessOptions? options) @@ -66,7 +57,7 @@ public class SerializationTests [InlineData("RevitObject.json.gz")] public async Task Basic_Namespace_Validation(string fileName) { - var closures = await TestFileManager.GetFileAsClosures(fileName); + var closures = TestFileManager.GetFileAsClosures(fileName); var deserializer = new SpeckleObjectDeserializer { ReadTransport = new TestTransport(closures), @@ -106,7 +97,7 @@ public class SerializationTests [InlineData("RevitObject.json.gz")] public async Task Basic_Namespace_Validation_New(string fileName) { - var closures = await TestFileManager.GetFileAsClosures(fileName); + var closures = TestFileManager.GetFileAsClosures(fileName); await using var process = new DeserializeProcess( new TestObjectLoader(closures), null, @@ -165,7 +156,7 @@ public class SerializationTests [InlineData("RevitObject.json.gz", "3416d3fe01c9196115514c4a2f41617b", 7818)] public async Task Roundtrip_Test_Old(string fileName, string _, int count) { - var closures = await TestFileManager.GetFileAsClosures(fileName); + var closures = TestFileManager.GetFileAsClosures(fileName); var deserializer = new SpeckleObjectDeserializer { ReadTransport = new TestTransport(closures), @@ -199,7 +190,7 @@ public class SerializationTests [InlineData("RevitObject.json.gz", "3416d3fe01c9196115514c4a2f41617b", 7818, 4674)] public async Task Roundtrip_Test_New(string fileName, string rootId, int oldCount, int newCount) { - var closures = await TestFileManager.GetFileAsClosures(fileName); + var closures = TestFileManager.GetFileAsClosures(fileName); closures.Count.Should().Be(oldCount); Base root; @@ -226,14 +217,12 @@ public class SerializationTests } var newIdToJson = new ConcurrentDictionary(); + await using ( - var serializeProcess = new SerializeProcess( + var serializeProcess = _factory.CreateSerializeProcess( + new ConcurrentDictionary(), + newIdToJson, null, - new DummySqLiteSendManager(), - new DummySendServerObjectManager(newIdToJson), - new BaseChildFinder(new BasePropertyGatherer()), - new BaseSerializer(new DummySqLiteSendManager(), new ObjectSerializerFactory(new BasePropertyGatherer())), - new NullLoggerFactory(), default, new SerializeProcessOptions(true, true, false, true) ) diff --git a/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj b/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj index 3f3689e8..bea3bd9b 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj +++ b/tests/Speckle.Sdk.Serialization.Tests/Speckle.Sdk.Serialization.Tests.csproj @@ -10,6 +10,7 @@ + diff --git a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json index 1298d82a..a9c01cb6 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json +++ b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json @@ -25,6 +25,15 @@ "System.Buffers": "4.6.0" } }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[2.2.0, )", + "resolved": "2.2.0", + "contentHash": "MZtBIwfDFork5vfjpJdG5g8wuJFt7d/y3LOSVVtDK/76wlbtz6cjltfKHqLx2TKVqTj5/c41t77m1+h20zqtPA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0" + } + }, "Microsoft.NET.Test.Sdk": { "type": "Direct", "requested": "[17.13.0, )", From d305fe59cb6829ae281e9b610ad8185c2aa5c6be Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Tue, 8 Apr 2025 10:49:31 +0100 Subject: [PATCH 35/37] feat(sdk) clean up registration of sdk to not be connector specific (#274) * First pass of ObjectSaver and better in-memory usage * fix some tests * add commit to match deserialize process * correct more tests * format * make a deserialize factory * fix tests? and format * use distinct * Fix mismerge * Fix serialization issues with tests * fix merges * follow copilot suggestions * remove disables * change registration to take strings and TypeLoader isn't public * remove unused transports * more test fixes * fmt * add Application object back --- src/Speckle.Sdk/Assemby.cs | 3 +- src/Speckle.Sdk/Host/HostAppVersion.cs | 24 ---- src/Speckle.Sdk/Host/HostApplication.cs | 13 -- src/Speckle.Sdk/Host/HostApplications.cs | 43 ------ src/Speckle.Sdk/Host/TypeLoader.cs | 4 +- src/Speckle.Sdk/ServiceRegistration.cs | 56 ++++++-- src/Speckle.Sdk/Transports/DiskTransport.cs | 128 ------------------ .../Program.cs | 7 +- .../CancellationTests.cs | 6 +- .../DetachedTests.cs | 6 +- .../ExceptionTests.cs | 6 +- .../ExplicitInterfaceTests.cs | 8 +- .../SerializationTests.cs | 5 +- .../TestServiceSetup.cs | 3 +- .../TestDataHelper.cs | 3 +- .../Host/HostApplicationTests.cs | 21 --- .../Serialisation/SimpleRoundTripTests.cs | 6 +- .../TestServiceSetup.cs | 6 +- .../Transports/DiskTransportTests.cs | 39 ------ 19 files changed, 65 insertions(+), 322 deletions(-) delete mode 100644 src/Speckle.Sdk/Host/HostAppVersion.cs delete mode 100644 src/Speckle.Sdk/Host/HostApplication.cs delete mode 100644 src/Speckle.Sdk/Host/HostApplications.cs delete mode 100644 src/Speckle.Sdk/Transports/DiskTransport.cs delete mode 100644 tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs delete mode 100644 tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs diff --git a/src/Speckle.Sdk/Assemby.cs b/src/Speckle.Sdk/Assemby.cs index e64211a6..ea434378 100644 --- a/src/Speckle.Sdk/Assemby.cs +++ b/src/Speckle.Sdk/Assemby.cs @@ -1,3 +1,4 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Speckle.Sdk.Tests.Unit")] +[assembly: InternalsVisibleTo("Speckle.Objects.Tests.Unit")] +[assembly: InternalsVisibleTo("Speckle.Sdk.Tests.Performance")] diff --git a/src/Speckle.Sdk/Host/HostAppVersion.cs b/src/Speckle.Sdk/Host/HostAppVersion.cs deleted file mode 100644 index b18b1a9f..00000000 --- a/src/Speckle.Sdk/Host/HostAppVersion.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace Speckle.Sdk.Host; - -public enum HostAppVersion -{ - v3, - v6, - v7, - v8, - v2019, - v2020, - v2021, - v2022, - v2023, - v2024, - v2025, - v2026, - v21, - v22, - v25, - v26, - v715, - v716, - v717, -} diff --git a/src/Speckle.Sdk/Host/HostApplication.cs b/src/Speckle.Sdk/Host/HostApplication.cs deleted file mode 100644 index 3037f8a8..00000000 --- a/src/Speckle.Sdk/Host/HostApplication.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Speckle.Sdk.Host; - -public readonly struct HostApplication -{ - public string Name { get; } - public string Slug { get; } - - public HostApplication(string name, string slug) - { - Name = name; - Slug = slug; - } -} diff --git a/src/Speckle.Sdk/Host/HostApplications.cs b/src/Speckle.Sdk/Host/HostApplications.cs deleted file mode 100644 index 2abced0a..00000000 --- a/src/Speckle.Sdk/Host/HostApplications.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace Speckle.Sdk.Host; - -/// -/// List of Host Applications - their slugs should match our ghost tags and ci/cd slugs -/// -public static class HostApplications -{ - public static string GetVersion(HostAppVersion version) => version.ToString().TrimStart('v'); - - public static readonly HostApplication Rhino = new("Rhino", "rhino"), - Grasshopper = new("Grasshopper", "grasshopper"), - Revit = new("Revit", "revit"), - Dynamo = new("Dynamo", "dynamo"), - Unity = new("Unity", "unity"), - GSA = new("GSA", "gsa"), - Civil = new("Civil 3D", "civil3d"), - Civil3D = new("Civil 3D", "civil3d"), - AutoCAD = new("AutoCAD", "autocad"), - MicroStation = new("MicroStation", "microstation"), - OpenRoads = new("OpenRoads", "openroads"), - OpenRail = new("OpenRail", "openrail"), - OpenBuildings = new("OpenBuildings", "openbuildings"), - ETABS = new("ETABS", "etabs"), - SAP2000 = new("SAP2000", "sap2000"), - CSiBridge = new("CSiBridge", "csibridge"), - SAFE = new("SAFE", "safe"), - TeklaStructures = new("Tekla Structures", "teklastructures"), - Dxf = new("DXF Converter", "dxf"), - Excel = new("Excel", "excel"), - Unreal = new("Unreal", "unreal"), - PowerBI = new("Power BI", "powerbi"), - Blender = new("Blender", "blender"), - QGIS = new("QGIS", "qgis"), - ArcGIS = new("ArcGIS", "arcgis"), - SketchUp = new("SketchUp", "sketchup"), - Archicad = new("Archicad", "archicad"), - TopSolid = new("TopSolid", "topsolid"), - Python = new("Python", "python"), - NET = new(".NET", "net"), - Navisworks = new("Navisworks", "navisworks"), - AdvanceSteel = new("Advance Steel", "advancesteel"), - Other = new("Other", "other"); -} diff --git a/src/Speckle.Sdk/Host/TypeLoader.cs b/src/Speckle.Sdk/Host/TypeLoader.cs index 18159abe..bae0d151 100644 --- a/src/Speckle.Sdk/Host/TypeLoader.cs +++ b/src/Speckle.Sdk/Host/TypeLoader.cs @@ -5,9 +5,9 @@ using Speckle.Sdk.Models; namespace Speckle.Sdk.Host; -public record LoadedType(string Name, Type Type, List DeprecatedNames); +internal record LoadedType(string Name, Type Type, List DeprecatedNames); -public static class TypeLoader +internal static class TypeLoader { private static bool s_initialized; private static List s_availableTypes = new(); diff --git a/src/Speckle.Sdk/ServiceRegistration.cs b/src/Speckle.Sdk/ServiceRegistration.cs index 703810dc..259f733f 100644 --- a/src/Speckle.Sdk/ServiceRegistration.cs +++ b/src/Speckle.Sdk/ServiceRegistration.cs @@ -7,25 +7,65 @@ using Speckle.Sdk.Logging; namespace Speckle.Sdk; +public record Application(string Name, string Slug); + +public record SpeckleSdkOptions( + Application Application, + string ApplicationVersion, + string? SpeckleVersion, + IEnumerable? Assemblies +); + public static class ServiceRegistration { + private static string GetAssemblyVersion() => + Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "Unknown"; + public static IServiceCollection AddSpeckleSdk( this IServiceCollection serviceCollection, - HostApplication application, - HostAppVersion version, - string speckleVersion + Application application, + string applicationVersion, + string? speckleVersion = null, + IEnumerable? assemblies = null + ) => serviceCollection.AddSpeckleSdk(new(application, applicationVersion, speckleVersion, assemblies)); + + public static IServiceCollection AddSpeckleSdk( + this IServiceCollection serviceCollection, + Application application, + string applicationVersion, + string? speckleVersion, + params Assembly[] assemblies + ) => serviceCollection.AddSpeckleSdk(new(application, applicationVersion, speckleVersion, assemblies)); + + public static IServiceCollection AddSpeckleSdk( + this IServiceCollection serviceCollection, + Application application, + string applicationVersion, + params Assembly[] assemblies + ) => serviceCollection.AddSpeckleSdk(new(application, applicationVersion, null, assemblies)); + + public static IServiceCollection AddSpeckleSdk( + this IServiceCollection serviceCollection, + SpeckleSdkOptions speckleSdkOptions ) { + var currentAssembly = Assembly.GetExecutingAssembly(); + var allAssembles = speckleSdkOptions.Assemblies?.ToList() ?? []; + if (!allAssembles.Contains(currentAssembly)) + { + allAssembles.Add(currentAssembly); + } + TypeLoader.Reset(); + TypeLoader.Initialize(allAssembles.ToArray()); serviceCollection.AddLogging(); - string name = application.Name; serviceCollection.AddSingleton( new SpeckleApplication { - HostApplication = name, - SpeckleVersion = speckleVersion, - HostApplicationVersion = HostApplications.GetVersion(version), - Slug = application.Slug, + HostApplication = speckleSdkOptions.Application.Name, + HostApplicationVersion = speckleSdkOptions.ApplicationVersion, + Slug = speckleSdkOptions.Application.Slug, + SpeckleVersion = speckleSdkOptions.SpeckleVersion ?? GetAssemblyVersion(), } ); serviceCollection.TryAddSingleton(); diff --git a/src/Speckle.Sdk/Transports/DiskTransport.cs b/src/Speckle.Sdk/Transports/DiskTransport.cs deleted file mode 100644 index 2c60a36d..00000000 --- a/src/Speckle.Sdk/Transports/DiskTransport.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System.Diagnostics; -using System.Text; -using Speckle.Sdk.Logging; - -namespace Speckle.Sdk.Transports; - -/// -/// Writes speckle objects to disk. -/// -public class DiskTransport : ICloneable, ITransport -{ - public DiskTransport(string? basePath = null) - { - basePath ??= Path.Combine(SpecklePathProvider.UserSpeckleFolderPath, "DiskTransportFiles"); - - RootPath = Path.Combine(basePath); - - Directory.CreateDirectory(RootPath); - } - - public string RootPath { get; set; } - - public object Clone() - { - return new DiskTransport - { - RootPath = RootPath, - CancellationToken = CancellationToken, - OnErrorAction = OnErrorAction, - OnProgressAction = OnProgressAction, - TransportName = TransportName, - }; - } - - public string TransportName { get; set; } = "Disk"; - - public Dictionary TransportContext => - new() - { - { "name", TransportName }, - { "type", GetType().Name }, - { "basePath", RootPath }, - }; - - public CancellationToken CancellationToken { get; set; } - - public IProgress? OnProgressAction { get; set; } - - public Action? OnErrorAction { get; set; } - - public int SavedObjectCount { get; private set; } - - public TimeSpan Elapsed { get; set; } = TimeSpan.Zero; - - public void BeginWrite() - { - SavedObjectCount = 0; - } - - public void EndWrite() { } - - public Task GetObject(string id) - { - CancellationToken.ThrowIfCancellationRequested(); - - var filePath = Path.Combine(RootPath, id); - if (File.Exists(filePath)) - { - return Task.FromResult(File.ReadAllText(filePath, Encoding.UTF8)); - } - - return Task.FromResult(null); - } - - public void SaveObject(string id, string serializedObject) - { - var stopwatch = Stopwatch.StartNew(); - CancellationToken.ThrowIfCancellationRequested(); - - var filePath = Path.Combine(RootPath, id); - if (File.Exists(filePath)) - { - return; - } - - try - { - File.WriteAllText(filePath, serializedObject, Encoding.UTF8); - } - catch (Exception ex) - { - throw new TransportException(this, $"Failed to write object {id} to disk", ex); - } - - SavedObjectCount++; - stopwatch.Stop(); - Elapsed += stopwatch.Elapsed; - } - - public Task WriteComplete() - { - return Task.CompletedTask; - } - - public async Task CopyObjectAndChildren(string id, ITransport targetTransport) - { - string res = await TransportHelpers - .CopyObjectAndChildrenAsync(id, this, targetTransport, CancellationToken) - .ConfigureAwait(false); - return res; - } - - public Task> HasObjects(IReadOnlyList objectIds) - { - Dictionary ret = new(); - foreach (string objectId in objectIds) - { - var filePath = Path.Combine(RootPath, objectId); - ret[objectId] = File.Exists(filePath); - } - return Task.FromResult(ret); - } - - public override string ToString() - { - return $"Disk Transport @{RootPath}"; - } -} diff --git a/tests/Speckle.Sdk.Serialization.Testing/Program.cs b/tests/Speckle.Sdk.Serialization.Testing/Program.cs index ca7a9d92..a0f2d95d 100644 --- a/tests/Speckle.Sdk.Serialization.Testing/Program.cs +++ b/tests/Speckle.Sdk.Serialization.Testing/Program.cs @@ -1,10 +1,7 @@ #pragma warning disable CA1506 -using System.Reflection; using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk; using Speckle.Sdk.Credentials; -using Speckle.Sdk.Host; -using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation.V2; using Speckle.Sdk.Serialisation.V2.Send; using Speckle.Sdk.Serialization.Testing; @@ -12,8 +9,6 @@ using Speckle.Sdk.Serialization.Testing; const bool skipCacheReceive = false; const bool skipCacheSendCheck = true; const bool skipCacheSendSave = false; -TypeLoader.Reset(); -TypeLoader.Initialize(typeof(Base).Assembly, Assembly.GetExecutingAssembly()); var url = "https://latest.speckle.systems/projects/a3ac1b2706/models/59d3b0f3c6"; //small? var streamId = "a3ac1b2706"; @@ -30,7 +25,7 @@ var streamId = "2099ac4b5f"; var rootId = "30fb4cbe6eb2202b9e7b4a4fcc3dd2b6";*/ var serviceCollection = new ServiceCollection(); -serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); +serviceCollection.AddSpeckleSdk(new("Tests", "test"), "v3"); var serviceProvider = serviceCollection.BuildServiceProvider(); Console.WriteLine("Attach"); diff --git a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.cs b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.cs index fba0327b..93e721d5 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/CancellationTests.cs @@ -3,7 +3,6 @@ using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Abstractions; using Speckle.Objects.Geometry; -using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Serialisation.V2; @@ -20,11 +19,8 @@ public class CancellationTests public CancellationTests() { - TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Base).Assembly, typeof(TestClass).Assembly, typeof(Polyline).Assembly); - var serviceCollection = new ServiceCollection(); - serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + serviceCollection.AddSpeckleSdk(new("Tests", "test"), "v3", typeof(TestClass).Assembly, typeof(Polyline).Assembly); var serviceProvider = serviceCollection.BuildServiceProvider(); _factory = serviceProvider.GetRequiredService(); diff --git a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs index ce06d3cc..5bd3ef94 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/DetachedTests.cs @@ -4,7 +4,6 @@ using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Speckle.Newtonsoft.Json.Linq; using Speckle.Objects.Geometry; -using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Serialisation.V2; @@ -20,11 +19,8 @@ public class DetachedTests public DetachedTests() { - TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Base).Assembly, typeof(DetachedTests).Assembly, typeof(Polyline).Assembly); - var serviceCollection = new ServiceCollection(); - serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + serviceCollection.AddSpeckleSdk(new("Tests", "test"), "v3", typeof(TestClass).Assembly, typeof(Polyline).Assembly); var serviceProvider = serviceCollection.BuildServiceProvider(); _factory = serviceProvider.GetRequiredService(); diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs index d31b80d1..01ce4c64 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ExceptionTests.cs @@ -3,7 +3,6 @@ using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging.Abstractions; using Speckle.Objects.Geometry; -using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Serialisation.V2; @@ -20,11 +19,8 @@ public class ExceptionTests public ExceptionTests() { - TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Base).Assembly, typeof(DetachedTests).Assembly, typeof(Polyline).Assembly); - var serviceCollection = new ServiceCollection(); - serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + serviceCollection.AddSpeckleSdk(new("Tests", "test"), "v3", typeof(TestClass).Assembly, typeof(Polyline).Assembly); var serviceProvider = serviceCollection.BuildServiceProvider(); _factory = serviceProvider.GetRequiredService(); diff --git a/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs b/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs index dc46b582..eddbd777 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/ExplicitInterfaceTests.cs @@ -1,6 +1,5 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using Microsoft.Extensions.DependencyInjection; -using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Serialisation; using Speckle.Sdk.Serialisation.V2; @@ -14,11 +13,8 @@ public class ExplicitInterfaceTests public ExplicitInterfaceTests() { - TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Base).Assembly, typeof(TestClass).Assembly); - var serviceCollection = new ServiceCollection(); - serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + serviceCollection.AddSpeckleSdk(new("Tests", "test"), "v3", typeof(TestClass).Assembly); var serviceProvider = serviceCollection.BuildServiceProvider(); _factory = serviceProvider.GetRequiredService(); diff --git a/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs b/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs index 64c77603..7a2f2c62 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs +++ b/tests/Speckle.Sdk.Serialization.Tests/SerializationTests.cs @@ -24,11 +24,8 @@ public class SerializationTests public SerializationTests() { - TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Base).Assembly, typeof(Mesh).Assembly, typeof(TestClass).Assembly); - var serviceCollection = new ServiceCollection(); - serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + serviceCollection.AddSpeckleSdk(new("Tests", "test"), "v3", typeof(TestClass).Assembly, typeof(Polyline).Assembly); var serviceProvider = serviceCollection.BuildServiceProvider(); _factory = serviceProvider.GetRequiredService(); diff --git a/tests/Speckle.Sdk.Tests.Integration/TestServiceSetup.cs b/tests/Speckle.Sdk.Tests.Integration/TestServiceSetup.cs index 30d44dff..c071ea36 100644 --- a/tests/Speckle.Sdk.Tests.Integration/TestServiceSetup.cs +++ b/tests/Speckle.Sdk.Tests.Integration/TestServiceSetup.cs @@ -1,5 +1,4 @@ using Microsoft.Extensions.DependencyInjection; -using Speckle.Sdk.Host; namespace Speckle.Sdk.Tests.Integration; @@ -8,7 +7,7 @@ public static class TestServiceSetup public static IServiceProvider GetServiceProvider() { var serviceCollection = new ServiceCollection(); - serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + serviceCollection.AddSpeckleSdk(new("Tests", "test"), "v3"); return serviceCollection.BuildServiceProvider(); } } diff --git a/tests/Speckle.Sdk.Tests.Performance/TestDataHelper.cs b/tests/Speckle.Sdk.Tests.Performance/TestDataHelper.cs index 9ca4a397..a82dd5e0 100644 --- a/tests/Speckle.Sdk.Tests.Performance/TestDataHelper.cs +++ b/tests/Speckle.Sdk.Tests.Performance/TestDataHelper.cs @@ -2,7 +2,6 @@ using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api; using Speckle.Sdk.Credentials; -using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Transports; @@ -19,7 +18,7 @@ public sealed class TestDataHelper : IDisposable public TestDataHelper() { var serviceCollection = new ServiceCollection(); - serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + serviceCollection.AddSpeckleSdk(new("Tests", "test"), "v3"); ServiceProvider = serviceCollection.BuildServiceProvider(); } diff --git a/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs b/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs deleted file mode 100644 index 288f5656..00000000 --- a/tests/Speckle.Sdk.Tests.Unit/Host/HostApplicationTests.cs +++ /dev/null @@ -1,21 +0,0 @@ -using FluentAssertions; -using Speckle.Sdk.Host; - -namespace Speckle.Sdk.Tests.Unit.Host; - -public class HostApplicationTests -{ - public static TheoryData HostAppVersionData => new(Enum.GetValues().ToList()); - - [Theory] - [MemberData(nameof(HostAppVersionData))] - public void HostAppVersionParsingTests(HostAppVersion appVersion) - { - // Assert that the string representation starts with 'v' - appVersion.ToString().StartsWith('v').Should().BeTrue(); - - // Assert that the parsed version is a positive integer - var version = HostApplications.GetVersion(appVersion); - int.Parse(version).Should().BePositive(); - } -} diff --git a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs index 63c64a26..16d80a9e 100644 --- a/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs +++ b/tests/Speckle.Sdk.Tests.Unit/Serialisation/SimpleRoundTripTests.cs @@ -1,8 +1,6 @@ -using System.Reflection; -using FluentAssertions; +using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using Speckle.Sdk.Api; -using Speckle.Sdk.Host; using Speckle.Sdk.Models; using Speckle.Sdk.Tests.Unit.Host; @@ -14,8 +12,6 @@ public class SimpleRoundTripTests public SimpleRoundTripTests() { - TypeLoader.Reset(); - TypeLoader.Initialize(typeof(Base).Assembly, Assembly.GetExecutingAssembly()); var serviceProvider = TestServiceSetup.GetServiceProvider(); _operations = serviceProvider.GetRequiredService(); } diff --git a/tests/Speckle.Sdk.Tests.Unit/TestServiceSetup.cs b/tests/Speckle.Sdk.Tests.Unit/TestServiceSetup.cs index 28493be0..bd6d4a39 100644 --- a/tests/Speckle.Sdk.Tests.Unit/TestServiceSetup.cs +++ b/tests/Speckle.Sdk.Tests.Unit/TestServiceSetup.cs @@ -1,5 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; -using Speckle.Sdk.Host; +using System.Reflection; +using Microsoft.Extensions.DependencyInjection; namespace Speckle.Sdk.Tests.Unit; @@ -8,7 +8,7 @@ public static class TestServiceSetup public static IServiceProvider GetServiceProvider() { var serviceCollection = new ServiceCollection(); - serviceCollection.AddSpeckleSdk(HostApplications.Navisworks, HostAppVersion.v2023, "Test"); + serviceCollection.AddSpeckleSdk(new("Tests", "test"), "v3", Assembly.GetExecutingAssembly()); return serviceCollection.BuildServiceProvider(); } } diff --git a/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs b/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs deleted file mode 100644 index 68e3d627..00000000 --- a/tests/Speckle.Sdk.Tests.Unit/Transports/DiskTransportTests.cs +++ /dev/null @@ -1,39 +0,0 @@ -using FluentAssertions; -using Speckle.Sdk.Common; -using Speckle.Sdk.Transports; - -namespace Speckle.Sdk.Tests.Unit.Transports; - -public sealed class DiskTransportTests : TransportTests, IDisposable -{ - private readonly DiskTransport _diskTransport; - private readonly string _basePath = $"./temp_{Guid.NewGuid()}"; - private const string ApplicationName = "Speckle Integration Tests"; - private readonly string _fullPath; - - protected override ITransport Sut => _diskTransport.NotNull(); - - public DiskTransportTests() - { - _fullPath = Path.Combine(_basePath, ApplicationName); - _diskTransport = new DiskTransport(_fullPath); - } - - [Fact] - public void DirectoryCreated_AfterInitialization() - { - // Act - var directoryExists = Directory.Exists(_fullPath); - - // Assert - directoryExists.Should().BeTrue(); - } - - public void Dispose() - { - if (Directory.Exists(_basePath)) - { - Directory.Delete(_basePath, true); - } - } -} From 001ca1c2877d16831d275b7762473fc08656bf90 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 9 Apr 2025 11:31:23 +0100 Subject: [PATCH 36/37] Update some dependencies (#275) --- Directory.Packages.props | 12 ++-- build/Program.cs | 16 ++--- build/packages.lock.json | 6 +- .../packages.lock.json | 12 ++-- .../packages.lock.json | 70 +++++++++--------- .../packages.lock.json | 70 +++++++++--------- tests/Speckle.Sdk.Testing/packages.lock.json | 60 ++++++++-------- .../packages.lock.json | 72 +++++++++---------- .../Speckle.Sdk.Tests.Unit/packages.lock.json | 70 +++++++++--------- 9 files changed, 194 insertions(+), 194 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index a3304d70..e7f38171 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -1,9 +1,9 @@ - + - + @@ -11,13 +11,13 @@ - + - + @@ -28,7 +28,7 @@ - + @@ -36,4 +36,4 @@ - \ No newline at end of file + diff --git a/build/Program.cs b/build/Program.cs index d3cd5221..3664b8a5 100644 --- a/build/Program.cs +++ b/build/Program.cs @@ -42,7 +42,7 @@ Target( Target( CLEAN, - ForEach("**/output"), + forEach: ["**/output"], dir => { IEnumerable GetDirectories(string d) @@ -68,13 +68,13 @@ Target( Target(RESTORE_TOOLS, () => RunAsync("dotnet", "tool restore")); -Target(FORMAT, DependsOn(RESTORE_TOOLS), () => RunAsync("dotnet", "csharpier --check .")); +Target(FORMAT, dependsOn: [RESTORE_TOOLS], () => RunAsync("dotnet", "csharpier --check .")); -Target(RESTORE, DependsOn(FORMAT), () => RunAsync("dotnet", "restore Speckle.Sdk.sln --locked-mode")); +Target(RESTORE, dependsOn: [FORMAT], () => RunAsync("dotnet", "restore Speckle.Sdk.sln --locked-mode")); Target( BUILD, - DependsOn(RESTORE), + dependsOn: [RESTORE], async () => { var (version, fileVersion) = await GetVersions().ConfigureAwait(false); @@ -89,7 +89,7 @@ Target( Target( TEST, - DependsOn(BUILD), + dependsOn: [BUILD], Glob.Files(".", "**/*.Tests.Unit.csproj").Concat(Glob.Files(".", "**/*.Tests.csproj")), async file => { @@ -103,7 +103,7 @@ Target( Target( INTEGRATION, - DependsOn(BUILD), + dependsOn: [BUILD], async () => { await RunAsync("docker", "compose -f docker-compose.yml up --wait").ConfigureAwait(false); @@ -170,7 +170,7 @@ Target( Target( PACK, - DependsOn(TEST), + dependsOn: [TEST], async () => { { @@ -182,6 +182,6 @@ Target( } ); -Target("default", DependsOn(FORMAT, TEST, INTEGRATION), () => Console.WriteLine("Done!")); +Target("default", dependsOn: [FORMAT, TEST, INTEGRATION], () => Console.WriteLine("Done!")); await RunTargetsAndExitAsync(args).ConfigureAwait(true); diff --git a/build/packages.lock.json b/build/packages.lock.json index 29700b45..9f4394a9 100644 --- a/build/packages.lock.json +++ b/build/packages.lock.json @@ -4,9 +4,9 @@ "net8.0": { "Bullseye": { "type": "Direct", - "requested": "[5.0.0, )", - "resolved": "5.0.0", - "contentHash": "bqyt+m17ym+5aN45C5oZRAjuLDt8jKiCm/ys1XfymIXSkrTFwvI/QsbY3ucPSHDz7SF7uON7B57kXFv5H2k1ew==" + "requested": "[6.0.0, )", + "resolved": "6.0.0", + "contentHash": "vgwwXfzs7jJrskWH7saHRMgPzziq/e86QZNWY1MnMxd7e+De7E7EX4K3C7yrvaK9y02SJoLxNxcLG/q5qUAghw==" }, "Glob": { "type": "Direct", diff --git a/src/Speckle.Sdk.Dependencies/packages.lock.json b/src/Speckle.Sdk.Dependencies/packages.lock.json index c0197ff7..516c518c 100644 --- a/src/Speckle.Sdk.Dependencies/packages.lock.json +++ b/src/Speckle.Sdk.Dependencies/packages.lock.json @@ -13,9 +13,9 @@ }, "Microsoft.Extensions.ObjectPool": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "r64veU9uYILp6pYqfo3qzRab8zLMALvXZgT4VRY79tXMLu8X79uTlJ6nqPLtPIVhfCPXycRh8ILyFz/gGBDQdQ==" + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "4uPdnj9hLRrb3ZSeVEDtwIm9nNrrT9vAXYC9o1/yTW8lGOPwTyI2QlkcICwYEGM1LESGTFidcPMFACznUZKbIQ==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", @@ -174,9 +174,9 @@ }, "Microsoft.Extensions.ObjectPool": { "type": "Direct", - "requested": "[9.0.1, )", - "resolved": "9.0.1", - "contentHash": "r64veU9uYILp6pYqfo3qzRab8zLMALvXZgT4VRY79tXMLu8X79uTlJ6nqPLtPIVhfCPXycRh8ILyFz/gGBDQdQ==" + "requested": "[9.0.3, )", + "resolved": "9.0.3", + "contentHash": "4uPdnj9hLRrb3ZSeVEDtwIm9nNrrT9vAXYC9o1/yTW8lGOPwTyI2QlkcICwYEGM1LESGTFidcPMFACznUZKbIQ==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", diff --git a/tests/Speckle.Objects.Tests.Unit/packages.lock.json b/tests/Speckle.Objects.Tests.Unit/packages.lock.json index 37ccf331..f86bb622 100644 --- a/tests/Speckle.Objects.Tests.Unit/packages.lock.json +++ b/tests/Speckle.Objects.Tests.Unit/packages.lock.json @@ -10,9 +10,9 @@ }, "AwesomeAssertions": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "6fWiV7mGZUzZXzeiW3hWF0nJokuuNm4hnzuqbM3IXHqGYkWnHl65+wNpuQ73xfJXClX0fmfKcTdQ2Ula719IDg==" + "requested": "[8.1.0, )", + "resolved": "8.1.0", + "contentHash": "IfNC4cpXPi9tclWvuNO9lfkuIxJsUTLTS1NXto55jDrAUQJYl0zLI9ByISrfkbBE2Xtg+IWaAXQ6jnUx3anDuw==" }, "Microsoft.NET.Test.Sdk": { "type": "Direct", @@ -60,8 +60,8 @@ }, "Argon": { "type": "Transitive", - "resolved": "0.26.0", - "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" + "resolved": "0.27.0", + "contentHash": "LtZKATYeTwDyYq1AXrgVU/ly+nI6GvE0GK1isJYFPQOnb2uHUxvDA+yh40QYaITGTLViXK7rbWhNKpbZ5pb9XA==" }, "Castle.Core": { "type": "Transitive", @@ -73,17 +73,17 @@ }, "DiffEngine": { "type": "Transitive", - "resolved": "15.9.0", - "contentHash": "shE6+tO4w5BmQTX0z+WnUV4UfmPNn6oTqBINbkts6OP0Icyx5WROSDzjjb95EwVYC4IAS+PxxS4Vbapxz4hkdw==", + "resolved": "16.1.0", + "contentHash": "ImEFC6BN62paN0N7v8vrLY3x/LpfbJaJy5yDtL+/L2As6FI1npGJcFZwzz1A7pdDjIYPOXE91qv6BpgEUGjDkA==", "dependencies": { - "EmptyFiles": "8.7.1", - "System.Management": "9.0.1" + "EmptyFiles": "8.8.0", + "System.Management": "8.0.0" } }, "EmptyFiles": { "type": "Transitive", - "resolved": "8.7.1", - "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw==" + "resolved": "8.8.0", + "contentHash": "d0pgc/vMyKgQ9T3qiiJBn1uYUSZ1/OShh6tySnNSkELRSgM4A4IOrpdQhLqwCkPwYvdJqzKuxQ6wn3MQAd4GNA==" }, "FSharp.Core": { "type": "Transitive", @@ -250,8 +250,8 @@ }, "System.CodeDom": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "2J5uq+2smnj+u1jlyVJ6BGGqaK9fHcK/EwN7mbsuPqTI6dZr86br8Cg6o/5B+icQ9ANTvTDpJjnhDNtYYZijHQ==" + "resolved": "8.0.0", + "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" }, "System.ComponentModel.Annotations": { "type": "Transitive", @@ -265,15 +265,15 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "jY+E/PElNWQiazN0YHqZGvcSedcZ4Wt0Os1nnJ2SzR3gWZlhNRDkSXOhuHJcLuImD8SrJQQ8TfU0W4mVcit2hg==" + "resolved": "9.0.3", + "contentHash": "BrMGzDRLz410PE4qC8UeKeAc0hFRjBkiCUOLTwuod65NAjqg5tDNqYU7gP0A09taEXtecB+HJc1NNnnTjsKFAQ==" }, "System.Management": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "CLEo9O6FuO4GQ3ZQkGssg9CJ2w2TN7GMFf3wHTc7YVWJV4xoyJRPw+XIDQnCcSUJCrHhrAWOO60cAX29EV5LFQ==", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", "dependencies": { - "System.CodeDom": "9.0.1" + "System.CodeDom": "8.0.0" } }, "System.Memory": { @@ -311,13 +311,13 @@ }, "Verify": { "type": "Transitive", - "resolved": "28.10.1", - "contentHash": "2B/VtFN5jtF5g28kaM4GdJZTwb3pisd4+wL2NEPi9ZYe2lghWsCzS30V6LF1ILApLBfAorAstkU/Vw3sDWRqrg==", + "resolved": "29.2.0", + "contentHash": "EhhwhXIeip9AJGWRPXh47NAUoiELnWzeBnAzFSl0+ryAfijTV1T+B4m6P6GbheWQ1CJ1cC1ZFLzgH276D5Bu3A==", "dependencies": { - "Argon": "0.26.0", - "DiffEngine": "15.9.0", + "Argon": "0.27.0", + "DiffEngine": "16.1.0", "SimpleInfoName": "3.1.0", - "System.IO.Hashing": "9.0.1" + "System.IO.Hashing": "9.0.3" } }, "xunit.abstractions": { @@ -381,10 +381,10 @@ "type": "Project", "dependencies": { "Microsoft.NET.Test.Sdk": "[17.13.0, )", - "Moq": "[4.20.70, )", + "Moq": "[4.20.72, )", "Speckle.Sdk": "[1.0.0, )", "Verify.Quibble": "[2.1.1, )", - "Verify.Xunit": "[28.10.1, )", + "Verify.Xunit": "[29.2.0, )", "xunit": "[2.9.3, )", "xunit.runner.visualstudio": "[3.0.2, )" } @@ -436,9 +436,9 @@ }, "Moq": { "type": "CentralTransitive", - "requested": "[4.20.70, )", - "resolved": "4.20.70", - "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "requested": "[4.20.72, )", + "resolved": "4.20.72", + "contentHash": "EA55cjyNn8eTNWrgrdZJH5QLFp2L43oxl1tlkoYUKIE9pRwL784OWiTXeCV5ApS+AMYEAlt7Fo03A2XfouvHmQ==", "dependencies": { "Castle.Core": "5.1.1" } @@ -468,15 +468,15 @@ }, "Verify.Xunit": { "type": "CentralTransitive", - "requested": "[28.10.1, )", - "resolved": "28.10.1", - "contentHash": "mkG7agMlx8oAEGcHoRY72hyDyNTdLIrzbfmniXFQgQ3yKulAHSYvYc9quzhpg0Sy+jb3svbdLqnRSg0VRhet3A==", + "requested": "[29.2.0, )", + "resolved": "29.2.0", + "contentHash": "MdcslVf40AzSA319ZHMzR+U4JqyquX28JFSrI9zA89yeZNaNcaSIb5PmE0XZ6p60Iy7eRYtnGEgSDimEUeXHZw==", "dependencies": { - "Argon": "0.26.0", - "DiffEngine": "15.9.0", + "Argon": "0.27.0", + "DiffEngine": "16.1.0", "SimpleInfoName": "3.1.0", - "System.IO.Hashing": "9.0.1", - "Verify": "28.10.1", + "System.IO.Hashing": "9.0.3", + "Verify": "29.2.0", "xunit.abstractions": "2.0.3", "xunit.extensibility.execution": "2.9.3" } diff --git a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json index a9c01cb6..517cd334 100644 --- a/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json +++ b/tests/Speckle.Sdk.Serialization.Tests/packages.lock.json @@ -10,9 +10,9 @@ }, "AwesomeAssertions": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "6fWiV7mGZUzZXzeiW3hWF0nJokuuNm4hnzuqbM3IXHqGYkWnHl65+wNpuQ73xfJXClX0fmfKcTdQ2Ula719IDg==" + "requested": "[8.1.0, )", + "resolved": "8.1.0", + "contentHash": "IfNC4cpXPi9tclWvuNO9lfkuIxJsUTLTS1NXto55jDrAUQJYl0zLI9ByISrfkbBE2Xtg+IWaAXQ6jnUx3anDuw==" }, "HttpMultipartParser": { "type": "Direct", @@ -56,9 +56,9 @@ }, "Moq": { "type": "Direct", - "requested": "[4.20.70, )", - "resolved": "4.20.70", - "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "requested": "[4.20.72, )", + "resolved": "4.20.72", + "contentHash": "EA55cjyNn8eTNWrgrdZJH5QLFp2L43oxl1tlkoYUKIE9pRwL784OWiTXeCV5ApS+AMYEAlt7Fo03A2XfouvHmQ==", "dependencies": { "Castle.Core": "5.1.1" } @@ -95,8 +95,8 @@ }, "Argon": { "type": "Transitive", - "resolved": "0.26.0", - "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" + "resolved": "0.27.0", + "contentHash": "LtZKATYeTwDyYq1AXrgVU/ly+nI6GvE0GK1isJYFPQOnb2uHUxvDA+yh40QYaITGTLViXK7rbWhNKpbZ5pb9XA==" }, "Castle.Core": { "type": "Transitive", @@ -108,17 +108,17 @@ }, "DiffEngine": { "type": "Transitive", - "resolved": "15.9.0", - "contentHash": "shE6+tO4w5BmQTX0z+WnUV4UfmPNn6oTqBINbkts6OP0Icyx5WROSDzjjb95EwVYC4IAS+PxxS4Vbapxz4hkdw==", + "resolved": "16.1.0", + "contentHash": "ImEFC6BN62paN0N7v8vrLY3x/LpfbJaJy5yDtL+/L2As6FI1npGJcFZwzz1A7pdDjIYPOXE91qv6BpgEUGjDkA==", "dependencies": { - "EmptyFiles": "8.7.1", - "System.Management": "9.0.1" + "EmptyFiles": "8.8.0", + "System.Management": "8.0.0" } }, "EmptyFiles": { "type": "Transitive", - "resolved": "8.7.1", - "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw==" + "resolved": "8.8.0", + "contentHash": "d0pgc/vMyKgQ9T3qiiJBn1uYUSZ1/OShh6tySnNSkELRSgM4A4IOrpdQhLqwCkPwYvdJqzKuxQ6wn3MQAd4GNA==" }, "FSharp.Core": { "type": "Transitive", @@ -295,8 +295,8 @@ }, "System.CodeDom": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "2J5uq+2smnj+u1jlyVJ6BGGqaK9fHcK/EwN7mbsuPqTI6dZr86br8Cg6o/5B+icQ9ANTvTDpJjnhDNtYYZijHQ==" + "resolved": "8.0.0", + "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" }, "System.ComponentModel.Annotations": { "type": "Transitive", @@ -310,15 +310,15 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "jY+E/PElNWQiazN0YHqZGvcSedcZ4Wt0Os1nnJ2SzR3gWZlhNRDkSXOhuHJcLuImD8SrJQQ8TfU0W4mVcit2hg==" + "resolved": "9.0.3", + "contentHash": "BrMGzDRLz410PE4qC8UeKeAc0hFRjBkiCUOLTwuod65NAjqg5tDNqYU7gP0A09taEXtecB+HJc1NNnnTjsKFAQ==" }, "System.Management": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "CLEo9O6FuO4GQ3ZQkGssg9CJ2w2TN7GMFf3wHTc7YVWJV4xoyJRPw+XIDQnCcSUJCrHhrAWOO60cAX29EV5LFQ==", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", "dependencies": { - "System.CodeDom": "9.0.1" + "System.CodeDom": "8.0.0" } }, "System.Memory": { @@ -356,13 +356,13 @@ }, "Verify": { "type": "Transitive", - "resolved": "28.10.1", - "contentHash": "2B/VtFN5jtF5g28kaM4GdJZTwb3pisd4+wL2NEPi9ZYe2lghWsCzS30V6LF1ILApLBfAorAstkU/Vw3sDWRqrg==", + "resolved": "29.2.0", + "contentHash": "EhhwhXIeip9AJGWRPXh47NAUoiELnWzeBnAzFSl0+ryAfijTV1T+B4m6P6GbheWQ1CJ1cC1ZFLzgH276D5Bu3A==", "dependencies": { - "Argon": "0.26.0", - "DiffEngine": "15.9.0", + "Argon": "0.27.0", + "DiffEngine": "16.1.0", "SimpleInfoName": "3.1.0", - "System.IO.Hashing": "9.0.1" + "System.IO.Hashing": "9.0.3" } }, "xunit.abstractions": { @@ -426,10 +426,10 @@ "type": "Project", "dependencies": { "Microsoft.NET.Test.Sdk": "[17.13.0, )", - "Moq": "[4.20.70, )", + "Moq": "[4.20.72, )", "Speckle.Sdk": "[1.0.0, )", "Verify.Quibble": "[2.1.1, )", - "Verify.Xunit": "[28.10.1, )", + "Verify.Xunit": "[29.2.0, )", "xunit": "[2.9.3, )", "xunit.runner.visualstudio": "[3.0.2, )" } @@ -504,15 +504,15 @@ }, "Verify.Xunit": { "type": "CentralTransitive", - "requested": "[28.10.1, )", - "resolved": "28.10.1", - "contentHash": "mkG7agMlx8oAEGcHoRY72hyDyNTdLIrzbfmniXFQgQ3yKulAHSYvYc9quzhpg0Sy+jb3svbdLqnRSg0VRhet3A==", + "requested": "[29.2.0, )", + "resolved": "29.2.0", + "contentHash": "MdcslVf40AzSA319ZHMzR+U4JqyquX28JFSrI9zA89yeZNaNcaSIb5PmE0XZ6p60Iy7eRYtnGEgSDimEUeXHZw==", "dependencies": { - "Argon": "0.26.0", - "DiffEngine": "15.9.0", + "Argon": "0.27.0", + "DiffEngine": "16.1.0", "SimpleInfoName": "3.1.0", - "System.IO.Hashing": "9.0.1", - "Verify": "28.10.1", + "System.IO.Hashing": "9.0.3", + "Verify": "29.2.0", "xunit.abstractions": "2.0.3", "xunit.extensibility.execution": "2.9.3" } diff --git a/tests/Speckle.Sdk.Testing/packages.lock.json b/tests/Speckle.Sdk.Testing/packages.lock.json index 5a3c6005..0b4d76b5 100644 --- a/tests/Speckle.Sdk.Testing/packages.lock.json +++ b/tests/Speckle.Sdk.Testing/packages.lock.json @@ -24,9 +24,9 @@ }, "Moq": { "type": "Direct", - "requested": "[4.20.70, )", - "resolved": "4.20.70", - "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "requested": "[4.20.72, )", + "resolved": "4.20.72", + "contentHash": "EA55cjyNn8eTNWrgrdZJH5QLFp2L43oxl1tlkoYUKIE9pRwL784OWiTXeCV5ApS+AMYEAlt7Fo03A2XfouvHmQ==", "dependencies": { "Castle.Core": "5.1.1" } @@ -56,15 +56,15 @@ }, "Verify.Xunit": { "type": "Direct", - "requested": "[28.10.1, )", - "resolved": "28.10.1", - "contentHash": "mkG7agMlx8oAEGcHoRY72hyDyNTdLIrzbfmniXFQgQ3yKulAHSYvYc9quzhpg0Sy+jb3svbdLqnRSg0VRhet3A==", + "requested": "[29.2.0, )", + "resolved": "29.2.0", + "contentHash": "MdcslVf40AzSA319ZHMzR+U4JqyquX28JFSrI9zA89yeZNaNcaSIb5PmE0XZ6p60Iy7eRYtnGEgSDimEUeXHZw==", "dependencies": { - "Argon": "0.26.0", - "DiffEngine": "15.9.0", + "Argon": "0.27.0", + "DiffEngine": "16.1.0", "SimpleInfoName": "3.1.0", - "System.IO.Hashing": "9.0.1", - "Verify": "28.10.1", + "System.IO.Hashing": "9.0.3", + "Verify": "29.2.0", "xunit.abstractions": "2.0.3", "xunit.extensibility.execution": "2.9.3" } @@ -88,8 +88,8 @@ }, "Argon": { "type": "Transitive", - "resolved": "0.26.0", - "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" + "resolved": "0.27.0", + "contentHash": "LtZKATYeTwDyYq1AXrgVU/ly+nI6GvE0GK1isJYFPQOnb2uHUxvDA+yh40QYaITGTLViXK7rbWhNKpbZ5pb9XA==" }, "Castle.Core": { "type": "Transitive", @@ -101,17 +101,17 @@ }, "DiffEngine": { "type": "Transitive", - "resolved": "15.9.0", - "contentHash": "shE6+tO4w5BmQTX0z+WnUV4UfmPNn6oTqBINbkts6OP0Icyx5WROSDzjjb95EwVYC4IAS+PxxS4Vbapxz4hkdw==", + "resolved": "16.1.0", + "contentHash": "ImEFC6BN62paN0N7v8vrLY3x/LpfbJaJy5yDtL+/L2As6FI1npGJcFZwzz1A7pdDjIYPOXE91qv6BpgEUGjDkA==", "dependencies": { - "EmptyFiles": "8.7.1", - "System.Management": "9.0.1" + "EmptyFiles": "8.8.0", + "System.Management": "8.0.0" } }, "EmptyFiles": { "type": "Transitive", - "resolved": "8.7.1", - "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw==" + "resolved": "8.8.0", + "contentHash": "d0pgc/vMyKgQ9T3qiiJBn1uYUSZ1/OShh6tySnNSkELRSgM4A4IOrpdQhLqwCkPwYvdJqzKuxQ6wn3MQAd4GNA==" }, "FSharp.Core": { "type": "Transitive", @@ -278,8 +278,8 @@ }, "System.CodeDom": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "2J5uq+2smnj+u1jlyVJ6BGGqaK9fHcK/EwN7mbsuPqTI6dZr86br8Cg6o/5B+icQ9ANTvTDpJjnhDNtYYZijHQ==" + "resolved": "8.0.0", + "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" }, "System.ComponentModel.Annotations": { "type": "Transitive", @@ -293,15 +293,15 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "jY+E/PElNWQiazN0YHqZGvcSedcZ4Wt0Os1nnJ2SzR3gWZlhNRDkSXOhuHJcLuImD8SrJQQ8TfU0W4mVcit2hg==" + "resolved": "9.0.3", + "contentHash": "BrMGzDRLz410PE4qC8UeKeAc0hFRjBkiCUOLTwuod65NAjqg5tDNqYU7gP0A09taEXtecB+HJc1NNnnTjsKFAQ==" }, "System.Management": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "CLEo9O6FuO4GQ3ZQkGssg9CJ2w2TN7GMFf3wHTc7YVWJV4xoyJRPw+XIDQnCcSUJCrHhrAWOO60cAX29EV5LFQ==", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", "dependencies": { - "System.CodeDom": "9.0.1" + "System.CodeDom": "8.0.0" } }, "System.Memory": { @@ -339,13 +339,13 @@ }, "Verify": { "type": "Transitive", - "resolved": "28.10.1", - "contentHash": "2B/VtFN5jtF5g28kaM4GdJZTwb3pisd4+wL2NEPi9ZYe2lghWsCzS30V6LF1ILApLBfAorAstkU/Vw3sDWRqrg==", + "resolved": "29.2.0", + "contentHash": "EhhwhXIeip9AJGWRPXh47NAUoiELnWzeBnAzFSl0+ryAfijTV1T+B4m6P6GbheWQ1CJ1cC1ZFLzgH276D5Bu3A==", "dependencies": { - "Argon": "0.26.0", - "DiffEngine": "15.9.0", + "Argon": "0.27.0", + "DiffEngine": "16.1.0", "SimpleInfoName": "3.1.0", - "System.IO.Hashing": "9.0.1" + "System.IO.Hashing": "9.0.3" } }, "xunit.abstractions": { diff --git a/tests/Speckle.Sdk.Tests.Integration/packages.lock.json b/tests/Speckle.Sdk.Tests.Integration/packages.lock.json index c7d3389c..9d7e5e45 100644 --- a/tests/Speckle.Sdk.Tests.Integration/packages.lock.json +++ b/tests/Speckle.Sdk.Tests.Integration/packages.lock.json @@ -59,8 +59,8 @@ }, "Argon": { "type": "Transitive", - "resolved": "0.26.0", - "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" + "resolved": "0.27.0", + "contentHash": "LtZKATYeTwDyYq1AXrgVU/ly+nI6GvE0GK1isJYFPQOnb2uHUxvDA+yh40QYaITGTLViXK7rbWhNKpbZ5pb9XA==" }, "Castle.Core": { "type": "Transitive", @@ -72,17 +72,17 @@ }, "DiffEngine": { "type": "Transitive", - "resolved": "15.9.0", - "contentHash": "shE6+tO4w5BmQTX0z+WnUV4UfmPNn6oTqBINbkts6OP0Icyx5WROSDzjjb95EwVYC4IAS+PxxS4Vbapxz4hkdw==", + "resolved": "16.1.0", + "contentHash": "ImEFC6BN62paN0N7v8vrLY3x/LpfbJaJy5yDtL+/L2As6FI1npGJcFZwzz1A7pdDjIYPOXE91qv6BpgEUGjDkA==", "dependencies": { - "EmptyFiles": "8.7.1", - "System.Management": "9.0.1" + "EmptyFiles": "8.8.0", + "System.Management": "8.0.0" } }, "EmptyFiles": { "type": "Transitive", - "resolved": "8.7.1", - "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw==" + "resolved": "8.8.0", + "contentHash": "d0pgc/vMyKgQ9T3qiiJBn1uYUSZ1/OShh6tySnNSkELRSgM4A4IOrpdQhLqwCkPwYvdJqzKuxQ6wn3MQAd4GNA==" }, "FSharp.Core": { "type": "Transitive", @@ -249,8 +249,8 @@ }, "System.CodeDom": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "2J5uq+2smnj+u1jlyVJ6BGGqaK9fHcK/EwN7mbsuPqTI6dZr86br8Cg6o/5B+icQ9ANTvTDpJjnhDNtYYZijHQ==" + "resolved": "8.0.0", + "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" }, "System.ComponentModel.Annotations": { "type": "Transitive", @@ -264,15 +264,15 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "jY+E/PElNWQiazN0YHqZGvcSedcZ4Wt0Os1nnJ2SzR3gWZlhNRDkSXOhuHJcLuImD8SrJQQ8TfU0W4mVcit2hg==" + "resolved": "9.0.3", + "contentHash": "BrMGzDRLz410PE4qC8UeKeAc0hFRjBkiCUOLTwuod65NAjqg5tDNqYU7gP0A09taEXtecB+HJc1NNnnTjsKFAQ==" }, "System.Management": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "CLEo9O6FuO4GQ3ZQkGssg9CJ2w2TN7GMFf3wHTc7YVWJV4xoyJRPw+XIDQnCcSUJCrHhrAWOO60cAX29EV5LFQ==", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", "dependencies": { - "System.CodeDom": "9.0.1" + "System.CodeDom": "8.0.0" } }, "System.Memory": { @@ -310,13 +310,13 @@ }, "Verify": { "type": "Transitive", - "resolved": "28.10.1", - "contentHash": "2B/VtFN5jtF5g28kaM4GdJZTwb3pisd4+wL2NEPi9ZYe2lghWsCzS30V6LF1ILApLBfAorAstkU/Vw3sDWRqrg==", + "resolved": "29.2.0", + "contentHash": "EhhwhXIeip9AJGWRPXh47NAUoiELnWzeBnAzFSl0+ryAfijTV1T+B4m6P6GbheWQ1CJ1cC1ZFLzgH276D5Bu3A==", "dependencies": { - "Argon": "0.26.0", - "DiffEngine": "15.9.0", + "Argon": "0.27.0", + "DiffEngine": "16.1.0", "SimpleInfoName": "3.1.0", - "System.IO.Hashing": "9.0.1" + "System.IO.Hashing": "9.0.3" } }, "xunit.abstractions": { @@ -374,10 +374,10 @@ "type": "Project", "dependencies": { "Microsoft.NET.Test.Sdk": "[17.13.0, )", - "Moq": "[4.20.70, )", + "Moq": "[4.20.72, )", "Speckle.Sdk": "[1.0.0, )", "Verify.Quibble": "[2.1.1, )", - "Verify.Xunit": "[28.10.1, )", + "Verify.Xunit": "[29.2.0, )", "xunit": "[2.9.3, )", "xunit.runner.visualstudio": "[3.0.2, )" } @@ -385,7 +385,7 @@ "speckle.sdk.tests.unit": { "type": "Project", "dependencies": { - "AwesomeAssertions": "[8.0.0, )", + "AwesomeAssertions": "[8.1.0, )", "Microsoft.Extensions.DependencyInjection": "[2.2.0, )", "Microsoft.NET.Test.Sdk": "[17.13.0, )", "RichardSzalay.MockHttp": "[7.0.0, )", @@ -398,9 +398,9 @@ }, "AwesomeAssertions": { "type": "CentralTransitive", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "6fWiV7mGZUzZXzeiW3hWF0nJokuuNm4hnzuqbM3IXHqGYkWnHl65+wNpuQ73xfJXClX0fmfKcTdQ2Ula719IDg==" + "requested": "[8.1.0, )", + "resolved": "8.1.0", + "contentHash": "IfNC4cpXPi9tclWvuNO9lfkuIxJsUTLTS1NXto55jDrAUQJYl0zLI9ByISrfkbBE2Xtg+IWaAXQ6jnUx3anDuw==" }, "GraphQL.Client": { "type": "CentralTransitive", @@ -458,9 +458,9 @@ }, "Moq": { "type": "CentralTransitive", - "requested": "[4.20.70, )", - "resolved": "4.20.70", - "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "requested": "[4.20.72, )", + "resolved": "4.20.72", + "contentHash": "EA55cjyNn8eTNWrgrdZJH5QLFp2L43oxl1tlkoYUKIE9pRwL784OWiTXeCV5ApS+AMYEAlt7Fo03A2XfouvHmQ==", "dependencies": { "Castle.Core": "5.1.1" } @@ -496,15 +496,15 @@ }, "Verify.Xunit": { "type": "CentralTransitive", - "requested": "[28.10.1, )", - "resolved": "28.10.1", - "contentHash": "mkG7agMlx8oAEGcHoRY72hyDyNTdLIrzbfmniXFQgQ3yKulAHSYvYc9quzhpg0Sy+jb3svbdLqnRSg0VRhet3A==", + "requested": "[29.2.0, )", + "resolved": "29.2.0", + "contentHash": "MdcslVf40AzSA319ZHMzR+U4JqyquX28JFSrI9zA89yeZNaNcaSIb5PmE0XZ6p60Iy7eRYtnGEgSDimEUeXHZw==", "dependencies": { - "Argon": "0.26.0", - "DiffEngine": "15.9.0", + "Argon": "0.27.0", + "DiffEngine": "16.1.0", "SimpleInfoName": "3.1.0", - "System.IO.Hashing": "9.0.1", - "Verify": "28.10.1", + "System.IO.Hashing": "9.0.3", + "Verify": "29.2.0", "xunit.abstractions": "2.0.3", "xunit.extensibility.execution": "2.9.3" } diff --git a/tests/Speckle.Sdk.Tests.Unit/packages.lock.json b/tests/Speckle.Sdk.Tests.Unit/packages.lock.json index 5f0bb4bd..f3b02a2e 100644 --- a/tests/Speckle.Sdk.Tests.Unit/packages.lock.json +++ b/tests/Speckle.Sdk.Tests.Unit/packages.lock.json @@ -10,9 +10,9 @@ }, "AwesomeAssertions": { "type": "Direct", - "requested": "[8.0.0, )", - "resolved": "8.0.0", - "contentHash": "6fWiV7mGZUzZXzeiW3hWF0nJokuuNm4hnzuqbM3IXHqGYkWnHl65+wNpuQ73xfJXClX0fmfKcTdQ2Ula719IDg==" + "requested": "[8.1.0, )", + "resolved": "8.1.0", + "contentHash": "IfNC4cpXPi9tclWvuNO9lfkuIxJsUTLTS1NXto55jDrAUQJYl0zLI9ByISrfkbBE2Xtg+IWaAXQ6jnUx3anDuw==" }, "Microsoft.Extensions.DependencyInjection": { "type": "Direct", @@ -75,8 +75,8 @@ }, "Argon": { "type": "Transitive", - "resolved": "0.26.0", - "contentHash": "n7btGXdtRyprGnpLMpBs6rLScxlvPtVWwmTR8h7CtJvpZXBGhGvibEdZxRjeTZNrwf403jJ0ZPpt35Pz/NaNsw==" + "resolved": "0.27.0", + "contentHash": "LtZKATYeTwDyYq1AXrgVU/ly+nI6GvE0GK1isJYFPQOnb2uHUxvDA+yh40QYaITGTLViXK7rbWhNKpbZ5pb9XA==" }, "Castle.Core": { "type": "Transitive", @@ -88,17 +88,17 @@ }, "DiffEngine": { "type": "Transitive", - "resolved": "15.9.0", - "contentHash": "shE6+tO4w5BmQTX0z+WnUV4UfmPNn6oTqBINbkts6OP0Icyx5WROSDzjjb95EwVYC4IAS+PxxS4Vbapxz4hkdw==", + "resolved": "16.1.0", + "contentHash": "ImEFC6BN62paN0N7v8vrLY3x/LpfbJaJy5yDtL+/L2As6FI1npGJcFZwzz1A7pdDjIYPOXE91qv6BpgEUGjDkA==", "dependencies": { - "EmptyFiles": "8.7.1", - "System.Management": "9.0.1" + "EmptyFiles": "8.8.0", + "System.Management": "8.0.0" } }, "EmptyFiles": { "type": "Transitive", - "resolved": "8.7.1", - "contentHash": "C8pvg0TvG2Mkn5LGNFGkFgFu8SUgYFwiu8U3y34qGQnnwKmGnlQTfTIUrtzfSjPxA4q7L/kRu09U5p32otZ2Aw==" + "resolved": "8.8.0", + "contentHash": "d0pgc/vMyKgQ9T3qiiJBn1uYUSZ1/OShh6tySnNSkELRSgM4A4IOrpdQhLqwCkPwYvdJqzKuxQ6wn3MQAd4GNA==" }, "FSharp.Core": { "type": "Transitive", @@ -265,8 +265,8 @@ }, "System.CodeDom": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "2J5uq+2smnj+u1jlyVJ6BGGqaK9fHcK/EwN7mbsuPqTI6dZr86br8Cg6o/5B+icQ9ANTvTDpJjnhDNtYYZijHQ==" + "resolved": "8.0.0", + "contentHash": "WTlRjL6KWIMr/pAaq3rYqh0TJlzpouaQ/W1eelssHgtlwHAH25jXTkUphTYx9HaIIf7XA6qs/0+YhtLEQRkJ+Q==" }, "System.ComponentModel.Annotations": { "type": "Transitive", @@ -280,15 +280,15 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "jY+E/PElNWQiazN0YHqZGvcSedcZ4Wt0Os1nnJ2SzR3gWZlhNRDkSXOhuHJcLuImD8SrJQQ8TfU0W4mVcit2hg==" + "resolved": "9.0.3", + "contentHash": "BrMGzDRLz410PE4qC8UeKeAc0hFRjBkiCUOLTwuod65NAjqg5tDNqYU7gP0A09taEXtecB+HJc1NNnnTjsKFAQ==" }, "System.Management": { "type": "Transitive", - "resolved": "9.0.1", - "contentHash": "CLEo9O6FuO4GQ3ZQkGssg9CJ2w2TN7GMFf3wHTc7YVWJV4xoyJRPw+XIDQnCcSUJCrHhrAWOO60cAX29EV5LFQ==", + "resolved": "8.0.0", + "contentHash": "jrK22i5LRzxZCfGb+tGmke2VH7oE0DvcDlJ1HAKYU8cPmD8XnpUT0bYn2Gy98GEhGjtfbR/sxKTVb+dE770pfA==", "dependencies": { - "System.CodeDom": "9.0.1" + "System.CodeDom": "8.0.0" } }, "System.Memory": { @@ -326,13 +326,13 @@ }, "Verify": { "type": "Transitive", - "resolved": "28.10.1", - "contentHash": "2B/VtFN5jtF5g28kaM4GdJZTwb3pisd4+wL2NEPi9ZYe2lghWsCzS30V6LF1ILApLBfAorAstkU/Vw3sDWRqrg==", + "resolved": "29.2.0", + "contentHash": "EhhwhXIeip9AJGWRPXh47NAUoiELnWzeBnAzFSl0+ryAfijTV1T+B4m6P6GbheWQ1CJ1cC1ZFLzgH276D5Bu3A==", "dependencies": { - "Argon": "0.26.0", - "DiffEngine": "15.9.0", + "Argon": "0.27.0", + "DiffEngine": "16.1.0", "SimpleInfoName": "3.1.0", - "System.IO.Hashing": "9.0.1" + "System.IO.Hashing": "9.0.3" } }, "xunit.abstractions": { @@ -390,10 +390,10 @@ "type": "Project", "dependencies": { "Microsoft.NET.Test.Sdk": "[17.13.0, )", - "Moq": "[4.20.70, )", + "Moq": "[4.20.72, )", "Speckle.Sdk": "[1.0.0, )", "Verify.Quibble": "[2.1.1, )", - "Verify.Xunit": "[28.10.1, )", + "Verify.Xunit": "[29.2.0, )", "xunit": "[2.9.3, )", "xunit.runner.visualstudio": "[3.0.2, )" } @@ -445,9 +445,9 @@ }, "Moq": { "type": "CentralTransitive", - "requested": "[4.20.70, )", - "resolved": "4.20.70", - "contentHash": "4rNnAwdpXJBuxqrOCzCyICXHSImOTRktCgCWXWykuF1qwoIsVvEnR7PjbMk/eLOxWvhmj5Kwt+kDV3RGUYcNwg==", + "requested": "[4.20.72, )", + "resolved": "4.20.72", + "contentHash": "EA55cjyNn8eTNWrgrdZJH5QLFp2L43oxl1tlkoYUKIE9pRwL784OWiTXeCV5ApS+AMYEAlt7Fo03A2XfouvHmQ==", "dependencies": { "Castle.Core": "5.1.1" } @@ -471,15 +471,15 @@ }, "Verify.Xunit": { "type": "CentralTransitive", - "requested": "[28.10.1, )", - "resolved": "28.10.1", - "contentHash": "mkG7agMlx8oAEGcHoRY72hyDyNTdLIrzbfmniXFQgQ3yKulAHSYvYc9quzhpg0Sy+jb3svbdLqnRSg0VRhet3A==", + "requested": "[29.2.0, )", + "resolved": "29.2.0", + "contentHash": "MdcslVf40AzSA319ZHMzR+U4JqyquX28JFSrI9zA89yeZNaNcaSIb5PmE0XZ6p60Iy7eRYtnGEgSDimEUeXHZw==", "dependencies": { - "Argon": "0.26.0", - "DiffEngine": "15.9.0", + "Argon": "0.27.0", + "DiffEngine": "16.1.0", "SimpleInfoName": "3.1.0", - "System.IO.Hashing": "9.0.1", - "Verify": "28.10.1", + "System.IO.Hashing": "9.0.3", + "Verify": "29.2.0", "xunit.abstractions": "2.0.3", "xunit.extensibility.execution": "2.9.3" } From 6df32262bd65ad58dbdacf36470efc4dc2cc88ae Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 9 Apr 2025 11:42:40 +0100 Subject: [PATCH 37/37] fix: Update HostAppVersion.cs (#276) Adding v2026 for next autodesk releases support. Co-authored-by: Jonathon Broughton <760691+jsdbroughton@users.noreply.github.com>