From fe976623caf1c2e4462ff6824e52c8877c885c75 Mon Sep 17 00:00:00 2001
From: Richard Irons <115992270+RichardIrons-neo4j@users.noreply.github.com>
Date: Thu, 22 Aug 2024 09:31:27 +0100
Subject: [PATCH] Add SCHEMA notification type (#813)

---
 .../Neo4j.Driver.Tests/ConfigTests.cs         |  2 ++
 .../SessionConfigBuilderTests.cs              |  2 ++
 .../Result/Summary/GqlStatusObject.cs         |  1 +
 .../Internal/Result/Summary/Notification.cs   |  1 +
 .../Public/Summary/NotificationCategory.cs    |  7 +++++-
 .../Summary/NotificationClassification.cs     |  5 ++++
 .../Neo4j.Driver/Public/Types/Category.cs     |  4 ++++
 .../Public/Types/Classification.cs            | 24 ++++++++++++-------
 8 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/Neo4j.Driver/Neo4j.Driver.Tests/ConfigTests.cs b/Neo4j.Driver/Neo4j.Driver.Tests/ConfigTests.cs
index e734fe8ff..2d9933c2d 100644
--- a/Neo4j.Driver/Neo4j.Driver.Tests/ConfigTests.cs
+++ b/Neo4j.Driver/Neo4j.Driver.Tests/ConfigTests.cs
@@ -249,6 +249,7 @@ public void WithTlsNegotiatorGeneric_ShouldSetTlsNegotiator()
         [InlineData(Classification.Deprecation, Category.Deprecation)]
         [InlineData(Classification.Security, Category.Security)]
         [InlineData(Classification.Topology, Category.Topology)]
+        [InlineData(Classification.Schema, Category.Schema)]
         [InlineData(Classification.Generic, Category.Generic)]
         public void WithNotifications_ShouldSetCategoryWithClassification(
             Classification classification,
@@ -281,6 +282,7 @@ public void WithNotifications_ShouldSetCategoryWithClassification(
         [InlineData(Category.Deprecation, Category.Deprecation)]
         [InlineData(Category.Security, Category.Security)]
         [InlineData(Category.Topology, Category.Topology)]
+        [InlineData(Category.Schema, Category.Schema)]
         [InlineData(Category.Generic, Category.Generic)]
         public void WithNotifications_ShouldSetCategory(
             Category inCat,
diff --git a/Neo4j.Driver/Neo4j.Driver.Tests/SessionConfigBuilderTests.cs b/Neo4j.Driver/Neo4j.Driver.Tests/SessionConfigBuilderTests.cs
index 9a71515b5..27572b798 100644
--- a/Neo4j.Driver/Neo4j.Driver.Tests/SessionConfigBuilderTests.cs
+++ b/Neo4j.Driver/Neo4j.Driver.Tests/SessionConfigBuilderTests.cs
@@ -30,6 +30,7 @@ public class SessionConfigBuilderTests
     [InlineData(Classification.Deprecation, Category.Deprecation)]
     [InlineData(Classification.Security, Category.Security)]
     [InlineData(Classification.Topology, Category.Topology)]
+    [InlineData(Classification.Schema, Category.Schema)]
     [InlineData(Classification.Generic, Category.Generic)]
     public void WithNotifications_ShouldSetCategoryWithClassification(
         Classification classification,
@@ -62,6 +63,7 @@ public void WithNotifications_ShouldSetCategoryWithClassification(
     [InlineData(Category.Deprecation, Category.Deprecation)]
     [InlineData(Category.Security, Category.Security)]
     [InlineData(Category.Topology, Category.Topology)]
+    [InlineData(Category.Schema, Category.Schema)]
     [InlineData(Category.Generic, Category.Generic)]
     public void WithNotifications_ShouldSetCategory(
         Category inCat,
diff --git a/Neo4j.Driver/Neo4j.Driver/Internal/Result/Summary/GqlStatusObject.cs b/Neo4j.Driver/Neo4j.Driver/Internal/Result/Summary/GqlStatusObject.cs
index c478129a4..de3de131e 100644
--- a/Neo4j.Driver/Neo4j.Driver/Internal/Result/Summary/GqlStatusObject.cs
+++ b/Neo4j.Driver/Neo4j.Driver/Internal/Result/Summary/GqlStatusObject.cs
@@ -66,6 +66,7 @@ private NotificationClassification ClassificationFrom(string rawClassification)
             "deprecation" => NotificationClassification.Deprecation,
             "security" => NotificationClassification.Security,
             "topology" => NotificationClassification.Topology,
+            "schema" => NotificationClassification.Schema,
             "generic" => NotificationClassification.Generic,
             _ => NotificationClassification.Unknown
         };
diff --git a/Neo4j.Driver/Neo4j.Driver/Internal/Result/Summary/Notification.cs b/Neo4j.Driver/Neo4j.Driver/Internal/Result/Summary/Notification.cs
index 4bf0f8933..36e1da1f9 100644
--- a/Neo4j.Driver/Neo4j.Driver/Internal/Result/Summary/Notification.cs
+++ b/Neo4j.Driver/Neo4j.Driver/Internal/Result/Summary/Notification.cs
@@ -58,6 +58,7 @@ private NotificationCategory ParseCategory(string category)
             "deprecation" => NotificationCategory.Deprecation,
             "security" => NotificationCategory.Security,
             "topology" => NotificationCategory.Topology,
+            "schema" => NotificationCategory.Schema,
             "generic" => NotificationCategory.Generic,
             _ => NotificationCategory.Unknown
         };
diff --git a/Neo4j.Driver/Neo4j.Driver/Public/Summary/NotificationCategory.cs b/Neo4j.Driver/Neo4j.Driver/Public/Summary/NotificationCategory.cs
index 84bfe6ecf..1873c8a8e 100644
--- a/Neo4j.Driver/Neo4j.Driver/Public/Summary/NotificationCategory.cs
+++ b/Neo4j.Driver/Neo4j.Driver/Public/Summary/NotificationCategory.cs
@@ -46,10 +46,15 @@ public enum NotificationCategory
     Security,
 
     /// <summary>
-    /// Topology notifications provide additional information related to managing databases and servers.
+    /// Information provided while executing database and server related commands.
     /// </summary>
     Topology,
 
+    /// <summary>
+    /// Information provided while managing indexes and constraints.
+    /// </summary>
+    Schema,
+
     /// <summary>Notification not covered by other categories.</summary>
     Generic
 }
diff --git a/Neo4j.Driver/Neo4j.Driver/Public/Summary/NotificationClassification.cs b/Neo4j.Driver/Neo4j.Driver/Public/Summary/NotificationClassification.cs
index e86f6a4c3..2ab608704 100644
--- a/Neo4j.Driver/Neo4j.Driver/Public/Summary/NotificationClassification.cs
+++ b/Neo4j.Driver/Neo4j.Driver/Public/Summary/NotificationClassification.cs
@@ -55,6 +55,11 @@ public enum NotificationClassification
     /// </summary>
     Topology,
 
+    /// <summary>
+    /// Schema notifications provide additional information related to managing indexes and constraints.
+    /// </summary>
+    Schema,
+
     /// <summary>Notification not covered by other categories.</summary>
     Generic
 }
diff --git a/Neo4j.Driver/Neo4j.Driver/Public/Types/Category.cs b/Neo4j.Driver/Neo4j.Driver/Public/Types/Category.cs
index 0a02238ba..8d1a8b563 100644
--- a/Neo4j.Driver/Neo4j.Driver/Public/Types/Category.cs
+++ b/Neo4j.Driver/Neo4j.Driver/Public/Types/Category.cs
@@ -59,6 +59,10 @@ public enum Category
     /// <remarks>Returned as <see cref="NotificationCategory.Topology"/></remarks>
     Topology,
 
+    /// <summary> Receive notifications related to managing indexes and constraints.</summary>
+    /// <remarks>Returned as <see cref="NotificationCategory.Schema"/></remarks>
+    Schema,
+
     /// <summary>Receive notifications not covered by other categories.</summary>
     /// <remarks>Returned as <see cref="NotificationCategory.Generic"/></remarks>
     Generic
diff --git a/Neo4j.Driver/Neo4j.Driver/Public/Types/Classification.cs b/Neo4j.Driver/Neo4j.Driver/Public/Types/Classification.cs
index 6f385cf8c..daddd85e9 100644
--- a/Neo4j.Driver/Neo4j.Driver/Public/Types/Classification.cs
+++ b/Neo4j.Driver/Neo4j.Driver/Public/Types/Classification.cs
@@ -30,15 +30,15 @@ public enum Classification
 {
     /// <summary>Receive notifications when a hint in query cannot be satisfied.</summary>
     /// <remarks>
-    /// Returned as <see cref="NotificationClassification.Hint"/> in <see cref="IGqlStatusObject.Classification"/> as
-    /// <see cref="NotificationCategory.Hint"/> in <see cref="INotification.Category"/>.
+    /// Returned as <see cref="NotificationClassification.Hint"/> in <see cref="IGqlStatusObject.Classification"/> and
+    /// as <see cref="NotificationCategory.Hint"/> in <see cref="INotification.Category"/>.
     /// </remarks>
     Hint,
 
     /// <summary>Receive notifications when a query or command mentions entities that are unknown to the system.</summary>
     /// <remarks>
     /// Returned as <see cref="NotificationClassification.Unrecognized"/> in
-    /// <see cref="IGqlStatusObject.Classification"/> as <see cref="NotificationCategory.Unrecognized"/> in
+    /// <see cref="IGqlStatusObject.Classification"/> and as <see cref="NotificationCategory.Unrecognized"/> in
     /// <see cref="INotification.Category"/>.
     /// </remarks>
     Unrecognized,
@@ -49,7 +49,7 @@ public enum Classification
     /// </summary>
     /// <remarks>
     /// Returned as <see cref="NotificationClassification.Unsupported"/> in
-    /// <see cref="IGqlStatusObject.Classification"/> as <see cref="NotificationCategory.Unsupported"/> in
+    /// <see cref="IGqlStatusObject.Classification"/> and as <see cref="NotificationCategory.Unsupported"/> in
     /// <see cref="INotification.Category"/>.
     /// </remarks>
     Unsupported,
@@ -57,7 +57,7 @@ public enum Classification
     /// <summary>Receive notifications when a query uses costly operations and might be slow.</summary>
     /// <remarks>
     /// Returned as <see cref="NotificationClassification.Performance"/> in
-    /// <see cref="IGqlStatusObject.Classification"/> as <see cref="NotificationCategory.Performance"/> in
+    /// <see cref="IGqlStatusObject.Classification"/> and as <see cref="NotificationCategory.Performance"/> in
     /// <see cref="INotification.Category"/>.
     /// </remarks>
     Performance,
@@ -65,7 +65,7 @@ public enum Classification
     /// <summary>Receive notifications when a query/command use deprecated features that should be replaced.</summary>
     /// <remarks>
     /// Returned as <see cref="NotificationClassification.Deprecation"/> in
-    /// <see cref="IGqlStatusObject.Classification"/> as <see cref="NotificationCategory.Deprecation"/> in
+    /// <see cref="IGqlStatusObject.Classification"/> and as <see cref="NotificationCategory.Deprecation"/> in
     /// <see cref="INotification.Category"/>.
     /// </remarks>
     Deprecation,
@@ -73,21 +73,27 @@ public enum Classification
     /// <summary>Receive notifications when the result of the query or command indicates a potential security issue.</summary>
     /// <remarks>
     /// Returned as <see cref="NotificationClassification.Security"/> in <see cref="IGqlStatusObject.Classification"/>
-    /// as <see cref="NotificationCategory.Security"/> in <see cref="INotification.Category"/>.
+    /// and as <see cref="NotificationCategory.Security"/> in <see cref="INotification.Category"/>.
     /// </remarks>
     Security,
 
     /// <summary>Receive notifications related to managing databases and servers.</summary>
     /// <remarks>
     /// Returned as <see cref="NotificationClassification.Topology"/> in <see cref="IGqlStatusObject.Classification"/>
-    /// as <see cref="NotificationCategory.Topology"/> in <see cref="INotification.Category"/>.
+    /// and as <see cref="NotificationCategory.Topology"/> in <see cref="INotification.Category"/>.
     /// </remarks>
     Topology,
 
+    /// <summary>Receive notifications related to managing indexes and constraints.</summary>
+    /// <remarks> Returned as <see cref="NotificationClassification.Schema"/> in <see cref="IGqlStatusObject.Classification"/>
+    /// and as <see cref="NotificationCategory.Schema"/> in <see cref="INotification.Category"/>.
+    /// </remarks>
+    Schema,
+
     /// <summary>Receive notifications not covered by other categories.</summary>
     /// <remarks>
     /// Returned as <see cref="NotificationClassification.Generic"/> in <see cref="IGqlStatusObject.Classification"/>
-    /// as <see cref="NotificationCategory.Generic"/> in <see cref="INotification.Category"/>.
+    /// and as <see cref="NotificationCategory.Generic"/> in <see cref="INotification.Category"/>.
     /// </remarks>
     Generic
 }