From f7e01384ea337716949156532e5eddc51dbb20ba Mon Sep 17 00:00:00 2001 From: Mike Chu Date: Wed, 3 Aug 2022 09:04:50 -0400 Subject: [PATCH 01/33] Initial GraphQLManager tests --- .../OdpTests/GraphQLManagerTest.cs | 94 +++++++++++++++++++ .../OptimizelySDK.Tests.csproj | 2 +- 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 OptimizelySDK.Tests/OdpTests/GraphQLManagerTest.cs diff --git a/OptimizelySDK.Tests/OdpTests/GraphQLManagerTest.cs b/OptimizelySDK.Tests/OdpTests/GraphQLManagerTest.cs new file mode 100644 index 00000000..e6ab009e --- /dev/null +++ b/OptimizelySDK.Tests/OdpTests/GraphQLManagerTest.cs @@ -0,0 +1,94 @@ +using Moq; +using NUnit.Framework; +using OptimizelySDK.Logger; +using OptimizelySDK.Odp; +using System; + +namespace OptimizelySDK.Tests.OdpTests +{ + [TestFixture] + public class GraphQLManagerTest + { + private Mock LoggerMock; + + [SetUp] + public void Setup() + { + LoggerMock = new Mock(); + LoggerMock.Setup(i => i.Log(It.IsAny(), It.IsAny())); + } + + [Test] + public void ShouldParseSuccessfulResponseData() + { + #region const string responseJson + const string responseJson = @" +{ + ""data"": { + ""customer"": { + ""audiences"": { + ""edges"": [ + { + ""node"": { + ""name"": ""has_email"", + ""state"": ""qualified"", + } + }, + { + ""node"": { + ""name"": ""has_email_opted_in"", + ""state"": ""qualified"", + } + }, + ... + ] + } + } + } +}"; + #endregion + var manager = new GraphQLManager(LoggerMock.Object); + + var response = manager.ParseResponse(responseJson); + + Assert.IsNull(response.Errors); + Assert.IsNotNull(response.Data); + } + + [Test] + public void ShouldParseErrorResponseWithNullData() + { + #region const string responseJson + const string responseJson = @" +{ + ""errors"": [ + { + ""message"": ""Exception while fetching data (/customer) : java.lang.RuntimeException: could not resolve _fs_user_id = asdsdaddddd"", + ""locations"": [ + { + ""line"": 2, + ""column"": 3 + } + ], + ""path"": [ + ""customer"" + ], + ""extensions"": { + ""classification"": ""InvalidIdentifierException"" + } + } + ], + ""data"": { + ""customer"": null + } +}"; + #endregion + var manager = new GraphQLManager(LoggerMock.Object); + + var response = manager.ParseResponse(responseJson); + + Assert.IsNull(response.Data); + Assert.IsNotNull(response.Errors); + } + } +} \ No newline at end of file diff --git a/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj b/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj index 2a776bcb..43b6b49b 100644 --- a/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj +++ b/OptimizelySDK.Tests/OptimizelySDK.Tests.csproj @@ -79,6 +79,7 @@ + @@ -136,7 +137,6 @@ OptimizelySDK - From 453671946937f0a3ee348a74341a352432ef1213 Mon Sep 17 00:00:00 2001 From: Mike Chu Date: Wed, 3 Aug 2022 13:58:49 -0400 Subject: [PATCH 02/33] Correct GraphQLManagerTest.cs --- .../OdpTests/GraphQLManagerTest.cs | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/OptimizelySDK.Tests/OdpTests/GraphQLManagerTest.cs b/OptimizelySDK.Tests/OdpTests/GraphQLManagerTest.cs index e6ab009e..295e2ba1 100644 --- a/OptimizelySDK.Tests/OdpTests/GraphQLManagerTest.cs +++ b/OptimizelySDK.Tests/OdpTests/GraphQLManagerTest.cs @@ -2,24 +2,23 @@ using NUnit.Framework; using OptimizelySDK.Logger; using OptimizelySDK.Odp; -using System; namespace OptimizelySDK.Tests.OdpTests { [TestFixture] public class GraphQLManagerTest { - private Mock LoggerMock; + private Mock MockLogger; [SetUp] public void Setup() { - LoggerMock = new Mock(); - LoggerMock.Setup(i => i.Log(It.IsAny(), It.IsAny())); + MockLogger = new Mock(); + MockLogger.Setup(i => i.Log(It.IsAny(), It.IsAny())); } [Test] - public void ShouldParseSuccessfulResponseData() + public void ShouldParseSuccessfulResponse() { #region const string responseJson const string responseJson = @" @@ -40,14 +39,13 @@ public void ShouldParseSuccessfulResponseData() ""state"": ""qualified"", } }, - ... - ] + ] } } } }"; #endregion - var manager = new GraphQLManager(LoggerMock.Object); + var manager = new GraphQLManager(MockLogger.Object); var response = manager.ParseResponse(responseJson); @@ -56,7 +54,7 @@ public void ShouldParseSuccessfulResponseData() } [Test] - public void ShouldParseErrorResponseWithNullData() + public void ShouldParseErrorResponse() { #region const string responseJson const string responseJson = @" @@ -65,10 +63,10 @@ public void ShouldParseErrorResponseWithNullData() { ""message"": ""Exception while fetching data (/customer) : java.lang.RuntimeException: could not resolve _fs_user_id = asdsdaddddd"", ""locations"": [ - { - ""line"": 2, - ""column"": 3 - } + { + ""line"": 2, + ""column"": 3 + } ], ""path"": [ ""customer"" @@ -83,11 +81,11 @@ public void ShouldParseErrorResponseWithNullData() } }"; #endregion - var manager = new GraphQLManager(LoggerMock.Object); + var manager = new GraphQLManager(MockLogger.Object); var response = manager.ParseResponse(responseJson); - Assert.IsNull(response.Data); + Assert.IsNull(response.Data.Customer); Assert.IsNotNull(response.Errors); } } From f2b4e79ce485c1606d28847e97b3dd0665b5bad6 Mon Sep 17 00:00:00 2001 From: Mike Chu Date: Wed, 3 Aug 2022 14:00:34 -0400 Subject: [PATCH 03/33] Add GraphQL manager and supporting entities --- OptimizelySDK/Odp/Entities/Audience.cs | 7 +++++++ OptimizelySDK/Odp/Entities/Customer.cs | 7 +++++++ OptimizelySDK/Odp/Entities/Data.cs | 7 +++++++ OptimizelySDK/Odp/Entities/Edge.cs | 7 +++++++ OptimizelySDK/Odp/Entities/Error.cs | 13 +++++++++++++ OptimizelySDK/Odp/Entities/Extension.cs | 7 +++++++ OptimizelySDK/Odp/Entities/Location.cs | 9 +++++++++ OptimizelySDK/Odp/Entities/Node.cs | 9 +++++++++ OptimizelySDK/Odp/Entities/Response.cs | 9 +++++++++ OptimizelySDK/Odp/GraphQLManager.cs | 24 ++++++++++++++++++++++++ OptimizelySDK/OptimizelySDK.csproj | 12 ++++++++++-- 11 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 OptimizelySDK/Odp/Entities/Audience.cs create mode 100644 OptimizelySDK/Odp/Entities/Customer.cs create mode 100644 OptimizelySDK/Odp/Entities/Data.cs create mode 100644 OptimizelySDK/Odp/Entities/Edge.cs create mode 100644 OptimizelySDK/Odp/Entities/Error.cs create mode 100644 OptimizelySDK/Odp/Entities/Extension.cs create mode 100644 OptimizelySDK/Odp/Entities/Location.cs create mode 100644 OptimizelySDK/Odp/Entities/Node.cs create mode 100644 OptimizelySDK/Odp/Entities/Response.cs create mode 100644 OptimizelySDK/Odp/GraphQLManager.cs diff --git a/OptimizelySDK/Odp/Entities/Audience.cs b/OptimizelySDK/Odp/Entities/Audience.cs new file mode 100644 index 00000000..251986d1 --- /dev/null +++ b/OptimizelySDK/Odp/Entities/Audience.cs @@ -0,0 +1,7 @@ +namespace OptimizelySDK.Odp.Entities +{ + public class Audience + { + public Edge[] Edges { get; set; } + } +} diff --git a/OptimizelySDK/Odp/Entities/Customer.cs b/OptimizelySDK/Odp/Entities/Customer.cs new file mode 100644 index 00000000..d3555e99 --- /dev/null +++ b/OptimizelySDK/Odp/Entities/Customer.cs @@ -0,0 +1,7 @@ +namespace OptimizelySDK.Odp.Entities +{ + public class Customer + { + public Audience Audiences { get; set; } + } +} diff --git a/OptimizelySDK/Odp/Entities/Data.cs b/OptimizelySDK/Odp/Entities/Data.cs new file mode 100644 index 00000000..334e361d --- /dev/null +++ b/OptimizelySDK/Odp/Entities/Data.cs @@ -0,0 +1,7 @@ +namespace OptimizelySDK.Odp.Entities +{ + public class Data + { + public Customer Customer { get; set; } + } +} diff --git a/OptimizelySDK/Odp/Entities/Edge.cs b/OptimizelySDK/Odp/Entities/Edge.cs new file mode 100644 index 00000000..259cfda9 --- /dev/null +++ b/OptimizelySDK/Odp/Entities/Edge.cs @@ -0,0 +1,7 @@ +namespace OptimizelySDK.Odp.Entities +{ + public class Edge + { + public Node Node { get; set; } + } +} diff --git a/OptimizelySDK/Odp/Entities/Error.cs b/OptimizelySDK/Odp/Entities/Error.cs new file mode 100644 index 00000000..c0eae0df --- /dev/null +++ b/OptimizelySDK/Odp/Entities/Error.cs @@ -0,0 +1,13 @@ +namespace OptimizelySDK.Odp.Entities +{ + public class Error + { + public string Message { get; set; } + + public Location[] Locations { get; set; } + + public string[] Path { get; set; } + + public Extension Extensions { get; set; } + } +} diff --git a/OptimizelySDK/Odp/Entities/Extension.cs b/OptimizelySDK/Odp/Entities/Extension.cs new file mode 100644 index 00000000..80e5473f --- /dev/null +++ b/OptimizelySDK/Odp/Entities/Extension.cs @@ -0,0 +1,7 @@ +namespace OptimizelySDK.Odp.Entities +{ + public class Extension + { + public string Classification { get; set; } + } +} \ No newline at end of file diff --git a/OptimizelySDK/Odp/Entities/Location.cs b/OptimizelySDK/Odp/Entities/Location.cs new file mode 100644 index 00000000..d5cebddf --- /dev/null +++ b/OptimizelySDK/Odp/Entities/Location.cs @@ -0,0 +1,9 @@ +namespace OptimizelySDK.Odp.Entities +{ + public class Location + { + public int Line { get; set; } + + public int Column { get; set; } + } +} diff --git a/OptimizelySDK/Odp/Entities/Node.cs b/OptimizelySDK/Odp/Entities/Node.cs new file mode 100644 index 00000000..4f7ab526 --- /dev/null +++ b/OptimizelySDK/Odp/Entities/Node.cs @@ -0,0 +1,9 @@ +namespace OptimizelySDK.Odp.Entities +{ + public class Node + { + public string Name { get; set; } + + public string State { get; set; } + } +} diff --git a/OptimizelySDK/Odp/Entities/Response.cs b/OptimizelySDK/Odp/Entities/Response.cs new file mode 100644 index 00000000..b7564f37 --- /dev/null +++ b/OptimizelySDK/Odp/Entities/Response.cs @@ -0,0 +1,9 @@ +namespace OptimizelySDK.Odp.Entities +{ + public class Response + { + public Data Data { get; set; } + + public Error[] Errors { get; set; } + } +} diff --git a/OptimizelySDK/Odp/GraphQLManager.cs b/OptimizelySDK/Odp/GraphQLManager.cs new file mode 100644 index 00000000..3adb61c1 --- /dev/null +++ b/OptimizelySDK/Odp/GraphQLManager.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; +using OptimizelySDK.Logger; +using OptimizelySDK.Odp.Entities; +using System.Text.RegularExpressions; + +namespace OptimizelySDK.Odp +{ + public class GraphQLManager + { + private readonly ILogger Logger; + + public GraphQLManager(ILogger logger) + { + Logger = logger; + } + + public Response ParseResponse(string jsonResponse) + { + var json = Regex.Replace(jsonResponse, @"\s+", string.Empty); + + return JsonConvert.DeserializeObject(json); + } + } +} diff --git a/OptimizelySDK/OptimizelySDK.csproj b/OptimizelySDK/OptimizelySDK.csproj index c8791237..3b2351ae 100644 --- a/OptimizelySDK/OptimizelySDK.csproj +++ b/OptimizelySDK/OptimizelySDK.csproj @@ -87,6 +87,16 @@ + + + + + + + + + + @@ -174,8 +184,6 @@ - -