From 842908e35ae60ac1365f0eb645edd288a5c59c27 Mon Sep 17 00:00:00 2001 From: raj pandey Date: Fri, 11 Jul 2025 15:47:42 +0530 Subject: [PATCH 1/3] Feat: Added Bulk Operations Support in Management SDK --- .../BulkOperation/BulkOperationModelsTest.cs | 354 +++++++++ .../BulkOperation/BulkOperationsUnitTest.cs | 660 +++++++++++++++++ .../Models/BulkReleaseItemsTest.cs | 154 ++++ .../Models/StackTest.cs | 695 ++++++++++++++++++ .../Services/BulkOperationServicesTest.cs | 552 ++++++++++++++ .../Models/BulkOperation.cs | 409 +++++++++++ .../Models/BulkOperationModels.cs | 389 ++++++++++ Contentstack.Management.Core/Models/Stack.cs | 30 + .../BulkOperation/BulkAddItemsService.cs | 51 ++ .../Stack/BulkOperation/BulkDeleteService.cs | 42 ++ .../BulkOperation/BulkJobStatusService.cs | 38 + .../Stack/BulkOperation/BulkPublishService.cs | 68 ++ .../BulkOperation/BulkReleaseItemsService.cs | 51 ++ .../BulkOperation/BulkUnpublishService.cs | 68 ++ .../BulkOperation/BulkUpdateItemsService.cs | 51 ++ .../BulkWorkflowUpdateService.cs | 42 ++ 16 files changed, 3654 insertions(+) create mode 100644 Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationModelsTest.cs create mode 100644 Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationsUnitTest.cs create mode 100644 Contentstack.Management.Core.Unit.Tests/Models/BulkReleaseItemsTest.cs create mode 100644 Contentstack.Management.Core.Unit.Tests/Services/BulkOperationServicesTest.cs create mode 100644 Contentstack.Management.Core/Models/BulkOperation.cs create mode 100644 Contentstack.Management.Core/Models/BulkOperationModels.cs create mode 100644 Contentstack.Management.Core/Services/Stack/BulkOperation/BulkAddItemsService.cs create mode 100644 Contentstack.Management.Core/Services/Stack/BulkOperation/BulkDeleteService.cs create mode 100644 Contentstack.Management.Core/Services/Stack/BulkOperation/BulkJobStatusService.cs create mode 100644 Contentstack.Management.Core/Services/Stack/BulkOperation/BulkPublishService.cs create mode 100644 Contentstack.Management.Core/Services/Stack/BulkOperation/BulkReleaseItemsService.cs create mode 100644 Contentstack.Management.Core/Services/Stack/BulkOperation/BulkUnpublishService.cs create mode 100644 Contentstack.Management.Core/Services/Stack/BulkOperation/BulkUpdateItemsService.cs create mode 100644 Contentstack.Management.Core/Services/Stack/BulkOperation/BulkWorkflowUpdateService.cs diff --git a/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationModelsTest.cs b/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationModelsTest.cs new file mode 100644 index 0000000..a6c6684 --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationModelsTest.cs @@ -0,0 +1,354 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; +using Contentstack.Management.Core.Models; + +namespace Contentstack.Management.Core.Unit.Tests.Models.BulkOperation +{ + [TestClass] + public class BulkOperationModelsTest + { + [TestMethod] + public void BulkPublishDetails_Serialization_Test() + { + // Arrange + var details = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Version = 1, + Locale = "en-us" + }, + new BulkPublishEntry + { + Uid = "entry_uid_2", + ContentType = "content_type_2", + Version = 2, + Locale = "en-gb" + } + }, + Assets = new List + { + new BulkPublishAsset { Uid = "asset_uid_1" }, + new BulkPublishAsset { Uid = "asset_uid_2" } + }, + Locales = new List { "en-us", "en-gb" }, + Environments = new List { "env_1", "env_2" } + }; + + // Act + var json = JsonConvert.SerializeObject(details); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual(2, deserialized.Entries.Count); + Assert.AreEqual(2, deserialized.Assets.Count); + Assert.AreEqual(2, deserialized.Locales.Count); + Assert.AreEqual(2, deserialized.Environments.Count); + + var firstEntry = deserialized.Entries.First(); + Assert.AreEqual("entry_uid_1", firstEntry.Uid); + Assert.AreEqual("content_type_1", firstEntry.ContentType); + Assert.AreEqual(1, firstEntry.Version); + Assert.AreEqual("en-us", firstEntry.Locale); + + var firstAsset = deserialized.Assets.First(); + Assert.AreEqual("asset_uid_1", firstAsset.Uid); + } + + [TestMethod] + public void BulkPublishEntry_WithContentType_Serialization_Test() + { + // Arrange + var entry = new BulkPublishEntry + { + Uid = "entry_uid", + ContentType = "content_type_1", + Version = 1, + Locale = "en-us" + }; + + // Act + var json = JsonConvert.SerializeObject(entry); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual("entry_uid", deserialized.Uid); + Assert.AreEqual("content_type_1", deserialized.ContentType); + Assert.AreEqual(1, deserialized.Version); + Assert.AreEqual("en-us", deserialized.Locale); + } + + [TestMethod] + public void BulkDeleteDetails_Serialization_Test() + { + // Arrange + var details = new BulkDeleteDetails + { + Entries = new List + { + new BulkDeleteEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Locale = "en-us" + }, + new BulkDeleteEntry + { + Uid = "entry_uid_2", + ContentType = "content_type_2", + Locale = "en-gb" + } + }, + Assets = new List + { + new BulkDeleteAsset { Uid = "asset_uid_1" }, + new BulkDeleteAsset { Uid = "asset_uid_2" } + } + }; + + // Act + var json = JsonConvert.SerializeObject(details); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual(2, deserialized.Entries.Count); + Assert.AreEqual(2, deserialized.Assets.Count); + + var firstEntry = deserialized.Entries.First(); + Assert.AreEqual("entry_uid_1", firstEntry.Uid); + Assert.AreEqual("content_type_1", firstEntry.ContentType); + Assert.AreEqual("en-us", firstEntry.Locale); + } + + [TestMethod] + public void BulkWorkflowUpdateBody_Serialization_Test() + { + // Arrange + var updateBody = new BulkWorkflowUpdateBody + { + Entries = new List + { + new BulkWorkflowEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Locale = "en-us" + } + }, + Workflow = new BulkWorkflowStage + { + Uid = "workflow_stage_uid", + Comment = "Test comment", + DueDate = "2023-12-01", + Notify = true, + AssignedTo = new List + { + new BulkWorkflowUser + { + Uid = "user_uid", + Name = "Test User", + Email = "test@example.com" + } + }, + AssignedByRoles = new List + { + new BulkWorkflowRole + { + Uid = "role_uid", + Name = "Test Role" + } + } + } + }; + + // Act + var json = JsonConvert.SerializeObject(updateBody); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual(1, deserialized.Entries.Count); + Assert.IsNotNull(deserialized.Workflow); + + var entry = deserialized.Entries.First(); + Assert.AreEqual("entry_uid_1", entry.Uid); + Assert.AreEqual("content_type_1", entry.ContentType); + Assert.AreEqual("en-us", entry.Locale); + + var workflow = deserialized.Workflow; + Assert.AreEqual("workflow_stage_uid", workflow.Uid); + Assert.AreEqual("Test comment", workflow.Comment); + Assert.AreEqual("2023-12-01", workflow.DueDate); + Assert.IsTrue(workflow.Notify); + Assert.AreEqual(1, workflow.AssignedTo.Count); + Assert.AreEqual(1, workflow.AssignedByRoles.Count); + + var user = workflow.AssignedTo.First(); + Assert.AreEqual("user_uid", user.Uid); + Assert.AreEqual("Test User", user.Name); + Assert.AreEqual("test@example.com", user.Email); + + var role = workflow.AssignedByRoles.First(); + Assert.AreEqual("role_uid", role.Uid); + Assert.AreEqual("Test Role", role.Name); + } + + [TestMethod] + public void BulkAddItemsData_Serialization_Test() + { + // Arrange + var data = new BulkAddItemsData + { + Items = new List + { + new BulkAddItem + { + Uid = "entry_uid_1", + ContentType = "content_type_1" + }, + new BulkAddItem + { + Uid = "entry_uid_2", + ContentType = "content_type_2" + } + } + }; + + // Act + var json = JsonConvert.SerializeObject(data); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual(2, deserialized.Items.Count); + + var firstItem = deserialized.Items.First(); + Assert.AreEqual("entry_uid_1", firstItem.Uid); + Assert.AreEqual("content_type_1", firstItem.ContentType); + } + + [TestMethod] + public void BulkPublishDetails_EmptyCollections_Test() + { + // Arrange + var details = new BulkPublishDetails(); + + // Act + var json = JsonConvert.SerializeObject(details); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.IsNotNull(deserialized.Entries); + Assert.IsNotNull(deserialized.Assets); + Assert.IsNotNull(deserialized.Locales); + Assert.IsNotNull(deserialized.Environments); + Assert.AreEqual(0, deserialized.Entries.Count); + Assert.AreEqual(0, deserialized.Assets.Count); + Assert.AreEqual(0, deserialized.Locales.Count); + Assert.AreEqual(0, deserialized.Environments.Count); + } + + [TestMethod] + public void BulkPublishDetails_WithRulesAndScheduling_Test() + { + // Arrange + var details = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "uid", + ContentType = "ct0", + Version = 5, + Locale = "en-us" + } + }, + Locales = new List { "en-us" }, + Environments = new List { "env1" }, + Rules = new BulkPublishRules + { + Approvals = "true" + }, + ScheduledAt = "2023-12-01T10:00:00Z", + PublishWithReference = true + }; + + // Act + var json = JsonConvert.SerializeObject(details); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual(1, deserialized.Entries.Count); + Assert.AreEqual(1, deserialized.Locales.Count); + Assert.AreEqual(1, deserialized.Environments.Count); + Assert.IsNotNull(deserialized.Rules); + Assert.AreEqual("true", deserialized.Rules.Approvals); + Assert.AreEqual("2023-12-01T10:00:00Z", deserialized.ScheduledAt); + Assert.IsTrue(deserialized.PublishWithReference); + + var entry = deserialized.Entries.First(); + Assert.AreEqual("uid", entry.Uid); + Assert.AreEqual("ct0", entry.ContentType); + Assert.AreEqual(5, entry.Version); + Assert.AreEqual("en-us", entry.Locale); + } + + [TestMethod] + public void BulkWorkflowStage_EmptyCollections_Test() + { + // Arrange + var workflowStage = new BulkWorkflowStage + { + Uid = "test_uid", + Comment = "test_comment" + }; + + // Act + var json = JsonConvert.SerializeObject(workflowStage); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual("test_uid", deserialized.Uid); + Assert.AreEqual("test_comment", deserialized.Comment); + Assert.IsNotNull(deserialized.AssignedTo); + Assert.IsNotNull(deserialized.AssignedByRoles); + Assert.AreEqual(0, deserialized.AssignedTo.Count); + Assert.AreEqual(0, deserialized.AssignedByRoles.Count); + } + + [TestMethod] + public void BulkPublishEntry_NullValues_Test() + { + // Arrange + var entry = new BulkPublishEntry + { + Uid = "entry_uid" + // Version is null by default + }; + + // Act + var json = JsonConvert.SerializeObject(entry); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual("entry_uid", deserialized.Uid); + Assert.AreEqual(0, deserialized.Version); // int defaults to 0, not null + Assert.IsNull(deserialized.ContentType); + Assert.IsNull(deserialized.Locale); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationsUnitTest.cs b/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationsUnitTest.cs new file mode 100644 index 0000000..1fe0313 --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationsUnitTest.cs @@ -0,0 +1,660 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Contentstack.Management.Core.Models; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Unit.Tests.Models.BulkOperation +{ + [TestClass] + public class BulkOperationsUnitTest + { + [TestMethod] + public void Test001_BulkReleaseItemsData_Serialization() + { + // Arrange + var releaseData = new BulkReleaseItemsData + { + Release = "release_uid", + Action = "publish", + Locale = new List { "en-us" }, + Reference = true, + Items = new List + { + new BulkReleaseItem + { + ContentTypeUid = "ct_1", + Uid = "uid", + Version = 2, + Locale = "en-us", + Title = "validation test" + } + } + }; + + // Act + var json = JsonConvert.SerializeObject(releaseData); + + // Assert + Assert.IsNotNull(json); + Assert.IsTrue(json.Contains("release")); + Assert.IsTrue(json.Contains("action")); + Assert.IsTrue(json.Contains("locale")); + Assert.IsTrue(json.Contains("reference")); + Assert.IsTrue(json.Contains("items")); + Assert.IsTrue(json.Contains("content_type_uid")); + Assert.IsTrue(json.Contains("uid")); + Assert.IsTrue(json.Contains("version")); + Assert.IsTrue(json.Contains("title")); + } + + [TestMethod] + public void Test002_BulkReleaseItem_Serialization() + { + // Arrange + var item = new BulkReleaseItem + { + ContentTypeUid = "ct_1", + Uid = "uid", + Version = 2, + Locale = "en-us", + Title = "validation test" + }; + + // Act + var json = JsonConvert.SerializeObject(item); + + // Assert + Assert.IsNotNull(json); + Assert.IsTrue(json.Contains("content_type_uid")); + Assert.IsTrue(json.Contains("uid")); + Assert.IsTrue(json.Contains("version")); + Assert.IsTrue(json.Contains("locale")); + Assert.IsTrue(json.Contains("title")); + } + + [TestMethod] + public void Test003_BulkReleaseItemsData_Deserialization() + { + // Arrange + var json = @"{ + ""release"": ""release_uid"", + ""action"": ""publish"", + ""locale"": [""en-us""], + ""reference"": true, + ""items"": [ + { + ""content_type_uid"": ""ct_1"", + ""uid"": ""uid"", + ""version"": 2, + ""locale"": ""en-us"", + ""title"": ""validation test"" + } + ] + }"; + + // Act + var releaseData = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(releaseData); + Assert.AreEqual("release_uid", releaseData.Release); + Assert.AreEqual("publish", releaseData.Action); + Assert.AreEqual(1, releaseData.Locale.Count); + Assert.AreEqual("en-us", releaseData.Locale[0]); + Assert.IsTrue(releaseData.Reference); + Assert.AreEqual(1, releaseData.Items.Count); + Assert.AreEqual("ct_1", releaseData.Items[0].ContentTypeUid); + Assert.AreEqual("uid", releaseData.Items[0].Uid); + Assert.AreEqual(2, releaseData.Items[0].Version); + Assert.AreEqual("en-us", releaseData.Items[0].Locale); + Assert.AreEqual("validation test", releaseData.Items[0].Title); + } + + [TestMethod] + public void Test004_BulkReleaseItem_Deserialization() + { + // Arrange + var json = @"{ + ""content_type_uid"": ""ct_1"", + ""uid"": ""uid"", + ""version"": 2, + ""locale"": ""en-us"", + ""title"": ""validation test"" + }"; + + // Act + var item = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(item); + Assert.AreEqual("ct_1", item.ContentTypeUid); + Assert.AreEqual("uid", item.Uid); + Assert.AreEqual(2, item.Version); + Assert.AreEqual("en-us", item.Locale); + Assert.AreEqual("validation test", item.Title); + } + + [TestMethod] + public void Test005_BulkReleaseItemsData_Empty_Collections() + { + // Arrange + var releaseData = new BulkReleaseItemsData(); + + // Act + var json = JsonConvert.SerializeObject(releaseData); + + // Assert + Assert.IsNotNull(json); + Assert.IsNotNull(releaseData.Locale); + Assert.IsNotNull(releaseData.Items); + Assert.AreEqual(0, releaseData.Locale.Count); + Assert.AreEqual(0, releaseData.Items.Count); + } + + [TestMethod] + public void Test006_BulkReleaseItemsData_Multiple_Items() + { + // Arrange + var releaseData = new BulkReleaseItemsData + { + Release = "release_uid", + Action = "publish", + Locale = new List { "en-us", "es-es" }, + Reference = true, + Items = new List + { + new BulkReleaseItem + { + ContentTypeUid = "ct_1", + Uid = "uid", + Version = 2, + Locale = "en-us", + Title = "validation test" + }, + new BulkReleaseItem + { + ContentTypeUid = "ct_2", + Uid = "blt**************47", + Version = 1, + Locale = "es-es", + Title = "prueba de validación" + } + } + }; + + // Act + var json = JsonConvert.SerializeObject(releaseData); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual(2, deserialized.Items.Count); + Assert.AreEqual(2, deserialized.Locale.Count); + Assert.AreEqual("ct_1", deserialized.Items[0].ContentTypeUid); + Assert.AreEqual("ct_2", deserialized.Items[1].ContentTypeUid); + Assert.AreEqual("en-us", deserialized.Locale[0]); + Assert.AreEqual("es-es", deserialized.Locale[1]); + } + + [TestMethod] + public void Test007_BulkReleaseItemsData_Different_Actions() + { + // Arrange + var publishData = new BulkReleaseItemsData + { + Release = "release_uid", + Action = "publish", + Locale = new List { "en-us" }, + Reference = true, + Items = new List() + }; + + var unpublishData = new BulkReleaseItemsData + { + Release = "release_uid", + Action = "unpublish", + Locale = new List { "en-us" }, + Reference = false, + Items = new List() + }; + + // Act + var publishJson = JsonConvert.SerializeObject(publishData); + var unpublishJson = JsonConvert.SerializeObject(unpublishData); + + // Assert + Assert.IsTrue(publishJson.Contains("publish")); + Assert.IsTrue(publishJson.Contains("true")); + Assert.IsTrue(unpublishJson.Contains("unpublish")); + Assert.IsTrue(unpublishJson.Contains("false")); + } + + [TestMethod] + public void Test008_BulkPublishDetails_Serialization() + { + // Arrange + var publishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Version = 5, + Locale = "en-us" + } + }, + Locales = new List { "en-us" }, + Environments = new List { "env1" }, + Rules = new BulkPublishRules + { + Approvals = "true" + }, + ScheduledAt = "2023-12-01T10:00:00Z", + PublishWithReference = true + }; + + // Act + var json = JsonConvert.SerializeObject(publishDetails); + + // Assert + Assert.IsNotNull(json); + Assert.IsTrue(json.Contains("entries")); + Assert.IsTrue(json.Contains("locales")); + Assert.IsTrue(json.Contains("environments")); + Assert.IsTrue(json.Contains("rules")); + Assert.IsTrue(json.Contains("scheduled_at")); + Assert.IsTrue(json.Contains("publish_with_reference")); + Assert.IsTrue(json.Contains("approvals")); + } + + [TestMethod] + public void Test009_BulkPublishDetails_Deserialization() + { + // Arrange + var json = @"{ + ""entries"": [ + { + ""uid"": ""blt0e0945888fb09dea"", + ""content_type"": ""ct0"", + ""version"": 5, + ""locale"": ""en-us"" + } + ], + ""locales"": [""en-us""], + ""environments"": [""env1""], + ""rules"": { + ""approvals"": ""true"" + }, + ""scheduled_at"": ""2023-12-01T10:00:00Z"", + ""publish_with_reference"": true + }"; + + // Act + var publishDetails = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(publishDetails); + Assert.AreEqual(1, publishDetails.Entries.Count); + Assert.AreEqual(1, publishDetails.Locales.Count); + Assert.AreEqual(1, publishDetails.Environments.Count); + Assert.IsNotNull(publishDetails.Rules); + Assert.AreEqual("true", publishDetails.Rules.Approvals); + Assert.AreEqual("2023-12-01T10:00:00Z", publishDetails.ScheduledAt); + Assert.IsTrue(publishDetails.PublishWithReference); + + var entry = publishDetails.Entries[0]; + Assert.AreEqual("blt0e0945888fb09dea", entry.Uid); + Assert.AreEqual("ct0", entry.ContentType); + Assert.AreEqual(5, entry.Version); + Assert.AreEqual("en-us", entry.Locale); + } + + [TestMethod] + public void Test010_BulkPublishEntry_Serialization() + { + // Arrange + var entry = new BulkPublishEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Version = 5, + Locale = "en-us" + }; + + // Act + var json = JsonConvert.SerializeObject(entry); + + // Assert + Assert.IsNotNull(json); + Assert.IsTrue(json.Contains("uid")); + Assert.IsTrue(json.Contains("content_type")); + Assert.IsTrue(json.Contains("version")); + Assert.IsTrue(json.Contains("locale")); + } + + [TestMethod] + public void Test011_BulkPublishRules_Serialization() + { + // Arrange + var rules = new BulkPublishRules + { + Approvals = "true" + }; + + // Act + var json = JsonConvert.SerializeObject(rules); + + // Assert + Assert.IsNotNull(json); + Assert.IsTrue(json.Contains("approvals")); + Assert.IsTrue(json.Contains("true")); + } + + [TestMethod] + public void Test012_BulkPublishRules_Deserialization() + { + // Arrange + var json = @"{ + ""approvals"": ""false"" + }"; + + // Act + var rules = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(rules); + Assert.AreEqual("false", rules.Approvals); + } + + [TestMethod] + public void Test013_BulkPublishDetails_Multiple_Entries() + { + // Arrange + var publishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Version = 5, + Locale = "en-us" + }, + new BulkPublishEntry + { + Uid = "bltabb69092b8d45ff7", + ContentType = "ct0", + Version = 1, + Locale = "en-us" + }, + new BulkPublishEntry + { + Uid = "blt5eb4637f09f0ac3e", + ContentType = "ct5", + Version = 2, + Locale = "en-us" + } + }, + Locales = new List { "en-us" }, + Environments = new List { "env1" }, + PublishWithReference = true + }; + + // Act + var json = JsonConvert.SerializeObject(publishDetails); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual(3, deserialized.Entries.Count); + Assert.AreEqual("blt0e0945888fb09dea", deserialized.Entries[0].Uid); + Assert.AreEqual("bltabb69092b8d45ff7", deserialized.Entries[1].Uid); + Assert.AreEqual("blt5eb4637f09f0ac3e", deserialized.Entries[2].Uid); + Assert.AreEqual("ct0", deserialized.Entries[0].ContentType); + Assert.AreEqual("ct0", deserialized.Entries[1].ContentType); + Assert.AreEqual("ct5", deserialized.Entries[2].ContentType); + } + + [TestMethod] + public void Test014_BulkPublishDetails_With_Assets() + { + // Arrange + var publishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Version = 5, + Locale = "en-us" + } + }, + Assets = new List + { + new BulkPublishAsset { Uid = "blt6f299e4805f0b1dd" } + }, + Locales = new List { "en-us" }, + Environments = new List { "env1" } + }; + + // Act + var json = JsonConvert.SerializeObject(publishDetails); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual(1, deserialized.Entries.Count); + Assert.AreEqual(1, deserialized.Assets.Count); + Assert.AreEqual("blt6f299e4805f0b1dd", deserialized.Assets[0].Uid); + } + + [TestMethod] + public void Test015_BulkPublishAsset_Serialization() + { + // Arrange + var asset = new BulkPublishAsset + { + Uid = "blt6f299e4805f0b1dd" + }; + + // Act + var json = JsonConvert.SerializeObject(asset); + + // Assert + Assert.IsNotNull(json); + Assert.IsTrue(json.Contains("uid")); + Assert.IsTrue(json.Contains("blt6f299e4805f0b1dd")); + } + + [TestMethod] + public void Test016_BulkPublishDetails_Empty_Collections() + { + // Arrange + var publishDetails = new BulkPublishDetails(); + + // Act + var json = JsonConvert.SerializeObject(publishDetails); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.IsNotNull(deserialized.Entries); + Assert.IsNotNull(deserialized.Assets); + Assert.IsNotNull(deserialized.Locales); + Assert.IsNotNull(deserialized.Environments); + Assert.AreEqual(0, deserialized.Entries.Count); + Assert.AreEqual(0, deserialized.Assets.Count); + Assert.AreEqual(0, deserialized.Locales.Count); + Assert.AreEqual(0, deserialized.Environments.Count); + } + + [TestMethod] + public void Test017_BulkReleaseItemsData_Null_Values() + { + // Arrange + var releaseData = new BulkReleaseItemsData + { + Release = null, + Action = null, + Items = new List + { + new BulkReleaseItem + { + ContentTypeUid = null, + Uid = null, + Locale = null, + Title = null + } + } + }; + + // Act + var json = JsonConvert.SerializeObject(releaseData); + + // Assert + Assert.IsNotNull(json); + // Should handle null values gracefully + } + + [TestMethod] + public void Test018_BulkPublishDetails_Null_Values() + { + // Arrange + var publishDetails = new BulkPublishDetails + { + Rules = null, + ScheduledAt = null, + Entries = new List + { + new BulkPublishEntry + { + Uid = null, + ContentType = null, + Locale = null + } + } + }; + + // Act + var json = JsonConvert.SerializeObject(publishDetails); + + // Assert + Assert.IsNotNull(json); + // Should handle null values gracefully + } + + [TestMethod] + public void Test019_BulkReleaseItemsData_Complex_Scenario() + { + // Arrange - Complex scenario with multiple items and different locales + var releaseData = new BulkReleaseItemsData + { + Release = "release_uid", + Action = "publish", + Locale = new List { "en-us", "es-es", "fr-fr" }, + Reference = true, + Items = new List + { + new BulkReleaseItem + { + ContentTypeUid = "ct_1", + Uid = "uid", + Version = 2, + Locale = "en-us", + Title = "validation test" + }, + new BulkReleaseItem + { + ContentTypeUid = "ct_2", + Uid = "blt**************47", + Version = 1, + Locale = "es-es", + Title = "prueba de validación" + }, + new BulkReleaseItem + { + ContentTypeUid = "ct_3", + Uid = "blt**************48", + Version = 3, + Locale = "fr-fr", + Title = "test de validation" + } + } + }; + + // Act + var json = JsonConvert.SerializeObject(releaseData); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual(3, deserialized.Locale.Count); + Assert.AreEqual(3, deserialized.Items.Count); + Assert.AreEqual("en-us", deserialized.Locale[0]); + Assert.AreEqual("es-es", deserialized.Locale[1]); + Assert.AreEqual("fr-fr", deserialized.Locale[2]); + Assert.AreEqual("ct_1", deserialized.Items[0].ContentTypeUid); + Assert.AreEqual("ct_2", deserialized.Items[1].ContentTypeUid); + Assert.AreEqual("ct_3", deserialized.Items[2].ContentTypeUid); + } + + [TestMethod] + public void Test020_BulkPublishDetails_Complex_Scenario() + { + // Arrange - Complex scenario with multiple entries, assets, and rules + var publishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Version = 5, + Locale = "en-us" + }, + new BulkPublishEntry + { + Uid = "bltabb69092b8d45ff7", + ContentType = "ct0", + Version = 1, + Locale = "en-us" + } + }, + Assets = new List + { + new BulkPublishAsset { Uid = "blt6f299e4805f0b1dd" }, + new BulkPublishAsset { Uid = "blt7f399f5916f1c2ee" } + }, + Locales = new List { "en-us", "es-es" }, + Environments = new List { "env1", "env2" }, + Rules = new BulkPublishRules + { + Approvals = "true" + }, + ScheduledAt = "2023-12-01T10:00:00Z", + PublishWithReference = true + }; + + // Act + var json = JsonConvert.SerializeObject(publishDetails); + var deserialized = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(deserialized); + Assert.AreEqual(2, deserialized.Entries.Count); + Assert.AreEqual(2, deserialized.Assets.Count); + Assert.AreEqual(2, deserialized.Locales.Count); + Assert.AreEqual(2, deserialized.Environments.Count); + Assert.IsNotNull(deserialized.Rules); + Assert.AreEqual("true", deserialized.Rules.Approvals); + Assert.AreEqual("2023-12-01T10:00:00Z", deserialized.ScheduledAt); + Assert.IsTrue(deserialized.PublishWithReference); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Models/BulkReleaseItemsTest.cs b/Contentstack.Management.Core.Unit.Tests/Models/BulkReleaseItemsTest.cs new file mode 100644 index 0000000..a34203b --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Models/BulkReleaseItemsTest.cs @@ -0,0 +1,154 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Contentstack.Management.Core.Models; +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Unit.Tests.Models +{ + [TestClass] + public class BulkReleaseItemsTest + { + [TestMethod] + public void Test001_BulkReleaseItemsData_Serialization() + { + // Arrange + var releaseData = new BulkReleaseItemsData + { + Release = "release_uid", + Action = "publish", + Locale = new List { "en-us" }, + Reference = true, + Items = new List + { + new BulkReleaseItem + { + ContentTypeUid = "ct_1", + Uid = "uid", + Version = 2, + Locale = "en-us", + Title = "validation test" + } + } + }; + + // Act + var json = JsonConvert.SerializeObject(releaseData); + + // Assert + Assert.IsNotNull(json); + Assert.IsTrue(json.Contains("release")); + Assert.IsTrue(json.Contains("action")); + Assert.IsTrue(json.Contains("locale")); + Assert.IsTrue(json.Contains("reference")); + Assert.IsTrue(json.Contains("items")); + Assert.IsTrue(json.Contains("content_type_uid")); + Assert.IsTrue(json.Contains("uid")); + Assert.IsTrue(json.Contains("version")); + Assert.IsTrue(json.Contains("title")); + } + + [TestMethod] + public void Test002_BulkReleaseItem_Serialization() + { + // Arrange + var item = new BulkReleaseItem + { + ContentTypeUid = "ct_1", + Uid = "uid", + Version = 2, + Locale = "en-us", + Title = "validation test" + }; + + // Act + var json = JsonConvert.SerializeObject(item); + + // Assert + Assert.IsNotNull(json); + Assert.IsTrue(json.Contains("content_type_uid")); + Assert.IsTrue(json.Contains("uid")); + Assert.IsTrue(json.Contains("version")); + Assert.IsTrue(json.Contains("locale")); + Assert.IsTrue(json.Contains("title")); + } + + [TestMethod] + public void Test003_BulkReleaseItemsData_Deserialization() + { + // Arrange + var json = @"{ + ""release"": ""release_uid"", + ""action"": ""publish"", + ""locale"": [""en-us""], + ""reference"": true, + ""items"": [ + { + ""content_type_uid"": ""ct_1"", + ""uid"": ""uid"", + ""version"": 2, + ""locale"": ""en-us"", + ""title"": ""validation test"" + } + ] + }"; + + // Act + var releaseData = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(releaseData); + Assert.AreEqual("release_uid", releaseData.Release); + Assert.AreEqual("publish", releaseData.Action); + Assert.AreEqual(1, releaseData.Locale.Count); + Assert.AreEqual("en-us", releaseData.Locale[0]); + Assert.IsTrue(releaseData.Reference); + Assert.AreEqual(1, releaseData.Items.Count); + Assert.AreEqual("ct_1", releaseData.Items[0].ContentTypeUid); + Assert.AreEqual("uid", releaseData.Items[0].Uid); + Assert.AreEqual(2, releaseData.Items[0].Version); + Assert.AreEqual("en-us", releaseData.Items[0].Locale); + Assert.AreEqual("validation test", releaseData.Items[0].Title); + } + + [TestMethod] + public void Test004_BulkReleaseItem_Deserialization() + { + // Arrange + var json = @"{ + ""content_type_uid"": ""ct_1"", + ""uid"": ""uid"", + ""version"": 2, + ""locale"": ""en-us"", + ""title"": ""validation test"" + }"; + + // Act + var item = JsonConvert.DeserializeObject(json); + + // Assert + Assert.IsNotNull(item); + Assert.AreEqual("ct_1", item.ContentTypeUid); + Assert.AreEqual("uid", item.Uid); + Assert.AreEqual(2, item.Version); + Assert.AreEqual("en-us", item.Locale); + Assert.AreEqual("validation test", item.Title); + } + + [TestMethod] + public void Test005_BulkReleaseItemsData_Empty_Collections() + { + // Arrange + var releaseData = new BulkReleaseItemsData(); + + // Act + var json = JsonConvert.SerializeObject(releaseData); + + // Assert + Assert.IsNotNull(json); + Assert.IsNotNull(releaseData.Locale); + Assert.IsNotNull(releaseData.Items); + Assert.AreEqual(0, releaseData.Locale.Count); + Assert.AreEqual(0, releaseData.Items.Count); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Models/StackTest.cs b/Contentstack.Management.Core.Unit.Tests/Models/StackTest.cs index e92cceb..2830139 100644 --- a/Contentstack.Management.Core.Unit.Tests/Models/StackTest.cs +++ b/Contentstack.Management.Core.Unit.Tests/Models/StackTest.cs @@ -575,5 +575,700 @@ public async System.Threading.Tasks.Task Should_Remove_User_From_Stack_Async() Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); } + + #region Bulk Operation Tests + + [TestMethod] + public void Should_Initialize_BulkOperation() + { + client.contentstackOptions.Authtoken = _fixture.Create(); + Stack stack = new Stack(client, _fixture.Create()); + + var bulkOperation = stack.BulkOperation(); + + Assert.IsNotNull(bulkOperation); + } + + [TestMethod] + public void Should_Throw_BulkOperation_Without_Authentication() + { + Stack stack = new Stack(client, _fixture.Create()); + + Assert.ThrowsException(() => stack.BulkOperation()); + } + + [TestMethod] + public void Should_Throw_BulkOperation_Without_API_Key() + { + client.contentstackOptions.Authtoken = _fixture.Create(); + Stack stack = new Stack(client); + + Assert.ThrowsException(() => stack.BulkOperation()); + } + + [TestMethod] + public void Should_Publish_Bulk_Operation() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var publishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Version = 1, + Locale = "en-us" + } + }, + Assets = new List + { + new BulkPublishAsset { Uid = "asset_uid_1" } + }, + Locales = new List { "en-us" }, + Environments = new List { "environment_1" } + }; + + ContentstackResponse response = stack.BulkOperation().Publish(publishDetails); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public async System.Threading.Tasks.Task Should_Publish_Bulk_Operation_Async() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var publishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Version = 1, + Locale = "en-us" + } + }, + Assets = new List + { + new BulkPublishAsset { Uid = "asset_uid_1" } + }, + Locales = new List { "en-us" }, + Environments = new List { "environment_1" } + }; + + ContentstackResponse response = await stack.BulkOperation().PublishAsync(publishDetails); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Publish_Bulk_Operation_With_Flags() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var publishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Version = 1, + Locale = "en-us" + } + }, + Locales = new List { "en-us" }, + Environments = new List { "environment_1" } + }; + + ContentstackResponse response = stack.BulkOperation().Publish(publishDetails, true, true, true); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Unpublish_Bulk_Operation() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var unpublishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Version = 1, + Locale = "en-us" + } + }, + Assets = new List + { + new BulkPublishAsset { Uid = "asset_uid_1" } + }, + Locales = new List { "en-us" }, + Environments = new List { "environment_1" } + }; + + ContentstackResponse response = stack.BulkOperation().Unpublish(unpublishDetails); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public async System.Threading.Tasks.Task Should_Unpublish_Bulk_Operation_Async() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var unpublishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Version = 1, + Locale = "en-us" + } + }, + Assets = new List + { + new BulkPublishAsset { Uid = "asset_uid_1" } + }, + Locales = new List { "en-us" }, + Environments = new List { "environment_1" } + }; + + ContentstackResponse response = await stack.BulkOperation().UnpublishAsync(unpublishDetails); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Delete_Bulk_Operation() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var deleteDetails = new BulkDeleteDetails + { + Entries = new List + { + new BulkDeleteEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Locale = "en-us" + } + }, + Assets = new List + { + new BulkDeleteAsset { Uid = "asset_uid_1" } + } + }; + + ContentstackResponse response = stack.BulkOperation().Delete(deleteDetails); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public async System.Threading.Tasks.Task Should_Delete_Bulk_Operation_Async() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var deleteDetails = new BulkDeleteDetails + { + Entries = new List + { + new BulkDeleteEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Locale = "en-us" + } + }, + Assets = new List + { + new BulkDeleteAsset { Uid = "asset_uid_1" } + } + }; + + ContentstackResponse response = await stack.BulkOperation().DeleteAsync(deleteDetails); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Update_Workflow_Bulk_Operation() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var updateBody = new BulkWorkflowUpdateBody + { + Entries = new List + { + new BulkWorkflowEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Locale = "en-us" + } + }, + Workflow = new BulkWorkflowStage + { + Uid = "workflow_stage_uid", + Comment = "Test comment" + } + }; + + ContentstackResponse response = stack.BulkOperation().Update(updateBody); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public async System.Threading.Tasks.Task Should_Update_Workflow_Bulk_Operation_Async() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var updateBody = new BulkWorkflowUpdateBody + { + Entries = new List + { + new BulkWorkflowEntry + { + Uid = "entry_uid_1", + ContentType = "content_type_1", + Locale = "en-us" + } + }, + Workflow = new BulkWorkflowStage + { + Uid = "workflow_stage_uid", + Comment = "Test comment" + } + }; + + ContentstackResponse response = await stack.BulkOperation().UpdateAsync(updateBody); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Add_Items_Bulk_Operation() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var itemsData = new BulkAddItemsData + { + Items = new List + { + new BulkAddItem + { + Uid = "entry_uid_1", + ContentType = "content_type_1" + } + } + }; + + ContentstackResponse response = stack.BulkOperation().AddItems(itemsData); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public async System.Threading.Tasks.Task Should_Add_Items_Bulk_Operation_Async() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var itemsData = new BulkAddItemsData + { + Items = new List + { + new BulkAddItem + { + Uid = "entry_uid_1", + ContentType = "content_type_1" + } + } + }; + + ContentstackResponse response = await stack.BulkOperation().AddItemsAsync(itemsData); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Add_Items_Bulk_Operation_With_Version() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var itemsData = new BulkAddItemsData + { + Items = new List + { + new BulkAddItem + { + Uid = "entry_uid_1", + ContentType = "content_type_1" + } + } + }; + + ContentstackResponse response = stack.BulkOperation().AddItems(itemsData, "1.0"); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Update_Items_Bulk_Operation() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var itemsData = new BulkAddItemsData + { + Items = new List + { + new BulkAddItem + { + Uid = "entry_uid_1", + ContentType = "content_type_1" + } + } + }; + + ContentstackResponse response = stack.BulkOperation().UpdateItems(itemsData); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public async System.Threading.Tasks.Task Should_Update_Items_Bulk_Operation_Async() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var itemsData = new BulkAddItemsData + { + Items = new List + { + new BulkAddItem + { + Uid = "entry_uid_1", + ContentType = "content_type_1" + } + } + }; + + ContentstackResponse response = await stack.BulkOperation().UpdateItemsAsync(itemsData); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Get_Job_Status_Bulk_Operation() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + ContentstackResponse response = stack.BulkOperation().JobStatus("job_id_123"); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public async System.Threading.Tasks.Task Should_Get_Job_Status_Bulk_Operation_Async() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + ContentstackResponse response = await stack.BulkOperation().JobStatusAsync("job_id_123"); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Get_Job_Status_Bulk_Operation_With_Version() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + ContentstackResponse response = stack.BulkOperation().JobStatus("job_id_123", "1.0"); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Release_Items_Bulk_Operation() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var releaseData = new BulkReleaseItemsData + { + Release = "release_uid_123", + Action = "publish", + Locale = new List { "en-us" }, + Reference = true, + Items = new List + { + new BulkReleaseItem + { + ContentTypeUid = "content_type_1", + Uid = "entry_uid_1", + Version = 1, + Locale = "en-us", + Title = "Test Entry" + } + } + }; + + ContentstackResponse response = stack.BulkOperation().ReleaseItems(releaseData); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public async System.Threading.Tasks.Task Should_Release_Items_Bulk_Operation_Async() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var releaseData = new BulkReleaseItemsData + { + Release = "release_uid_123", + Action = "publish", + Locale = new List { "en-us" }, + Reference = true, + Items = new List + { + new BulkReleaseItem + { + ContentTypeUid = "content_type_1", + Uid = "entry_uid_1", + Version = 1, + Locale = "en-us", + Title = "Test Entry" + } + } + }; + + ContentstackResponse response = await stack.BulkOperation().ReleaseItemsAsync(releaseData); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Release_Items_Bulk_Operation_With_Version() + { + var contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt"); + client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(contentstackResponse)); + client.contentstackOptions.Authtoken = _fixture.Create(); + + Stack stack = new Stack(client, _fixture.Create()); + + var releaseData = new BulkReleaseItemsData + { + Release = "release_uid_123", + Action = "publish", + Locale = new List { "en-us" }, + Reference = true, + Items = new List + { + new BulkReleaseItem + { + ContentTypeUid = "content_type_1", + Uid = "entry_uid_1", + Version = 1, + Locale = "en-us", + Title = "Test Entry" + } + } + }; + + ContentstackResponse response = stack.BulkOperation().ReleaseItems(releaseData, "1.0"); + + Assert.AreEqual(contentstackResponse.OpenResponse(), response.OpenResponse()); + Assert.AreEqual(contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString()); + } + + [TestMethod] + public void Should_Throw_Bulk_Operation_With_Null_Publish_Details() + { + client.contentstackOptions.Authtoken = _fixture.Create(); + Stack stack = new Stack(client, _fixture.Create()); + + Assert.ThrowsException(() => stack.BulkOperation().Publish(null)); + Assert.ThrowsExceptionAsync(() => stack.BulkOperation().PublishAsync(null)); + } + + [TestMethod] + public void Should_Throw_Bulk_Operation_With_Null_Unpublish_Details() + { + client.contentstackOptions.Authtoken = _fixture.Create(); + Stack stack = new Stack(client, _fixture.Create()); + + Assert.ThrowsException(() => stack.BulkOperation().Unpublish(null)); + Assert.ThrowsExceptionAsync(() => stack.BulkOperation().UnpublishAsync(null)); + } + + [TestMethod] + public void Should_Throw_Bulk_Operation_With_Null_Delete_Details() + { + client.contentstackOptions.Authtoken = _fixture.Create(); + Stack stack = new Stack(client, _fixture.Create()); + + Assert.ThrowsException(() => stack.BulkOperation().Delete(null)); + Assert.ThrowsExceptionAsync(() => stack.BulkOperation().DeleteAsync(null)); + } + + [TestMethod] + public void Should_Throw_Bulk_Operation_With_Null_Update_Body() + { + client.contentstackOptions.Authtoken = _fixture.Create(); + Stack stack = new Stack(client, _fixture.Create()); + + Assert.ThrowsException(() => stack.BulkOperation().Update(null)); + Assert.ThrowsExceptionAsync(() => stack.BulkOperation().UpdateAsync(null)); + } + + [TestMethod] + public void Should_Throw_Bulk_Operation_With_Null_Add_Items_Data() + { + client.contentstackOptions.Authtoken = _fixture.Create(); + Stack stack = new Stack(client, _fixture.Create()); + + Assert.ThrowsException(() => stack.BulkOperation().AddItems(null)); + Assert.ThrowsExceptionAsync(() => stack.BulkOperation().AddItemsAsync(null)); + } + + [TestMethod] + public void Should_Throw_Bulk_Operation_With_Null_Update_Items_Data() + { + client.contentstackOptions.Authtoken = _fixture.Create(); + Stack stack = new Stack(client, _fixture.Create()); + + Assert.ThrowsException(() => stack.BulkOperation().UpdateItems(null)); + Assert.ThrowsExceptionAsync(() => stack.BulkOperation().UpdateItemsAsync(null)); + } + + [TestMethod] + public void Should_Throw_Bulk_Operation_With_Null_Job_Id() + { + client.contentstackOptions.Authtoken = _fixture.Create(); + Stack stack = new Stack(client, _fixture.Create()); + + Assert.ThrowsException(() => stack.BulkOperation().JobStatus(null)); + Assert.ThrowsExceptionAsync(() => stack.BulkOperation().JobStatusAsync(null)); + } + + [TestMethod] + public void Should_Throw_Bulk_Operation_With_Null_Release_Data() + { + client.contentstackOptions.Authtoken = _fixture.Create(); + Stack stack = new Stack(client, _fixture.Create()); + + Assert.ThrowsException(() => stack.BulkOperation().ReleaseItems(null)); + Assert.ThrowsExceptionAsync(() => stack.BulkOperation().ReleaseItemsAsync(null)); + } + + #endregion } } diff --git a/Contentstack.Management.Core.Unit.Tests/Services/BulkOperationServicesTest.cs b/Contentstack.Management.Core.Unit.Tests/Services/BulkOperationServicesTest.cs new file mode 100644 index 0000000..ea8d6f8 --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Services/BulkOperationServicesTest.cs @@ -0,0 +1,552 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Contentstack.Management.Core.Models; +using Contentstack.Management.Core.Services.Stack.BulkOperation; +using Contentstack.Management.Core; +using System.Collections.Generic; +using Newtonsoft.Json; +using System.Text; + +namespace Contentstack.Management.Core.Unit.Tests.Services +{ + [TestClass] + public class BulkOperationServicesTest + { + private JsonSerializer _serializer; + private Stack _stack; + + [TestInitialize] + public void Setup() + { + _serializer = new JsonSerializer(); + var client = new ContentstackClient("test_token", "test_host"); + _stack = client.Stack("test_api_key"); + } + + [TestMethod] + public void Test001_BulkReleaseItemsService_Initialization() + { + // Arrange + var releaseData = new BulkReleaseItemsData + { + Release = "release_uid", + Action = "publish", + Locale = new List { "en-us" }, + Reference = true, + Items = new List + { + new BulkReleaseItem + { + ContentTypeUid = "ct_1", + Uid = "uid", + Version = 2, + Locale = "en-us", + Title = "validation test" + } + } + }; + + // Act + var service = new BulkReleaseItemsService(_serializer, _stack, releaseData, "1.0"); + + // Assert + Assert.IsNotNull(service); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + Assert.AreEqual("POST", service.HttpMethod); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual("1.0", service.Headers["bulk_version"]); + } + + [TestMethod] + public void Test002_BulkReleaseItemsService_ContentBody() + { + // Arrange + var releaseData = new BulkReleaseItemsData + { + Release = "release_uid", + Action = "publish", + Locale = new List { "en-us" }, + Reference = true, + Items = new List + { + new BulkReleaseItem + { + ContentTypeUid = "ct_1", + Uid = "uid", + Version = 2, + Locale = "en-us", + Title = "validation test" + } + } + }; + + var service = new BulkReleaseItemsService(_serializer, _stack, releaseData); + + // Act + service.ContentBody(); + + // Assert + Assert.IsNotNull(service.ByteContent); + Assert.IsTrue(service.ByteContent.Length > 0); + + var json = Encoding.UTF8.GetString(service.ByteContent); + Assert.IsTrue(json.Contains("release")); + Assert.IsTrue(json.Contains("action")); + Assert.IsTrue(json.Contains("locale")); + Assert.IsTrue(json.Contains("reference")); + Assert.IsTrue(json.Contains("items")); + } + + [TestMethod] + public void Test003_BulkReleaseItemsService_Without_BulkVersion() + { + // Arrange + var releaseData = new BulkReleaseItemsData + { + Release = "release_uid", + Action = "publish", + Locale = new List { "en-us" }, + Reference = true, + Items = new List() + }; + + // Act + var service = new BulkReleaseItemsService(_serializer, _stack, releaseData); + + // Assert + Assert.IsNotNull(service); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + Assert.AreEqual("POST", service.HttpMethod); + Assert.IsFalse(service.Headers.ContainsKey("bulk_version")); + } + + [TestMethod] + public void Test004_BulkPublishService_Initialization() + { + // Arrange + var publishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Version = 5, + Locale = "en-us" + } + }, + Locales = new List { "en-us" }, + Environments = new List { "env1" } + }; + + // Act + var service = new BulkPublishService(_serializer, _stack, publishDetails, true, true, true); + + // Assert + Assert.IsNotNull(service); + Assert.AreEqual("/bulk/publish", service.ResourcePath); + Assert.AreEqual("POST", service.HttpMethod); + Assert.IsTrue(service.Headers.ContainsKey("skip_workflow_stage_check")); + Assert.IsTrue(service.Headers.ContainsKey("approvals")); + Assert.AreEqual("true", service.Headers["skip_workflow_stage_check"]); + Assert.AreEqual("true", service.Headers["approvals"]); + } + + [TestMethod] + public void Test005_BulkPublishService_ContentBody() + { + // Arrange + var publishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Version = 5, + Locale = "en-us" + } + }, + Locales = new List { "en-us" }, + Environments = new List { "env1" } + }; + + var service = new BulkPublishService(_serializer, _stack, publishDetails); + + // Act + service.ContentBody(); + + // Assert + Assert.IsNotNull(service.ByteContent); + Assert.IsTrue(service.ByteContent.Length > 0); + + var json = Encoding.UTF8.GetString(service.ByteContent); + Assert.IsTrue(json.Contains("entries")); + Assert.IsTrue(json.Contains("locales")); + Assert.IsTrue(json.Contains("environments")); + } + + [TestMethod] + public void Test006_BulkPublishService_With_All_Flags() + { + // Arrange + var publishDetails = new BulkPublishDetails + { + Entries = new List(), + Locales = new List { "en-us" }, + Environments = new List { "env1" } + }; + + // Act + var service = new BulkPublishService(_serializer, _stack, publishDetails, true, true, true); + + // Assert + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("skip_workflow_stage_check")); + Assert.IsTrue(service.Headers.ContainsKey("approvals")); + Assert.AreEqual("true", service.Headers["skip_workflow_stage_check"]); + Assert.AreEqual("true", service.Headers["approvals"]); + } + + [TestMethod] + public void Test007_BulkPublishService_Without_Flags() + { + // Arrange + var publishDetails = new BulkPublishDetails + { + Entries = new List(), + Locales = new List { "en-us" }, + Environments = new List { "env1" } + }; + + // Act + var service = new BulkPublishService(_serializer, _stack, publishDetails, false, false, false); + + // Assert + Assert.IsNotNull(service); + Assert.IsFalse(service.Headers.ContainsKey("skip_workflow_stage_check")); + Assert.IsFalse(service.Headers.ContainsKey("approvals")); + } + + [TestMethod] + public void Test008_BulkUnpublishService_Initialization() + { + // Arrange + var unpublishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Version = 5, + Locale = "en-us" + } + }, + Locales = new List { "en-us" }, + Environments = new List { "env1" } + }; + + // Act + var service = new BulkUnpublishService(_serializer, _stack, unpublishDetails, true, true, true); + + // Assert + Assert.IsNotNull(service); + Assert.AreEqual("/bulk/unpublish", service.ResourcePath); + Assert.AreEqual("POST", service.HttpMethod); + Assert.IsTrue(service.Headers.ContainsKey("skip_workflow_stage_check")); + Assert.IsTrue(service.Headers.ContainsKey("approvals")); + } + + [TestMethod] + public void Test009_BulkUnpublishService_ContentBody() + { + // Arrange + var unpublishDetails = new BulkPublishDetails + { + Entries = new List + { + new BulkPublishEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Version = 5, + Locale = "en-us" + } + }, + Locales = new List { "en-us" }, + Environments = new List { "env1" } + }; + + var service = new BulkUnpublishService(_serializer, _stack, unpublishDetails); + + // Act + service.ContentBody(); + + // Assert + Assert.IsNotNull(service.ByteContent); + Assert.IsTrue(service.ByteContent.Length > 0); + + var json = Encoding.UTF8.GetString(service.ByteContent); + Assert.IsTrue(json.Contains("entries")); + Assert.IsTrue(json.Contains("locales")); + Assert.IsTrue(json.Contains("environments")); + } + + [TestMethod] + public void Test010_BulkDeleteService_Initialization() + { + // Arrange + var deleteDetails = new BulkDeleteDetails + { + Entries = new List + { + new BulkDeleteEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Locale = "en-us" + } + }, + Assets = new List + { + new BulkDeleteAsset { Uid = "blt6f299e4805f0b1dd" } + } + }; + + // Act + var service = new BulkDeleteService(_serializer, _stack, deleteDetails); + + // Assert + Assert.IsNotNull(service); + Assert.AreEqual("/bulk/delete", service.ResourcePath); + Assert.AreEqual("POST", service.HttpMethod); + } + + [TestMethod] + public void Test011_BulkDeleteService_ContentBody() + { + // Arrange + var deleteDetails = new BulkDeleteDetails + { + Entries = new List + { + new BulkDeleteEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Locale = "en-us" + } + }, + Assets = new List + { + new BulkDeleteAsset { Uid = "blt6f299e4805f0b1dd" } + } + }; + + var service = new BulkDeleteService(_serializer, _stack, deleteDetails); + + // Act + service.ContentBody(); + + // Assert + Assert.IsNotNull(service.ByteContent); + Assert.IsTrue(service.ByteContent.Length > 0); + + var json = Encoding.UTF8.GetString(service.ByteContent); + Assert.IsTrue(json.Contains("entries")); + Assert.IsTrue(json.Contains("assets")); + } + + [TestMethod] + public void Test012_BulkWorkflowUpdateService_Initialization() + { + // Arrange + var updateBody = new BulkWorkflowUpdateBody + { + Entries = new List + { + new BulkWorkflowEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Locale = "en-us" + } + }, + Workflow = new BulkWorkflowStage + { + Uid = "workflow_stage_uid", + Comment = "Test comment", + DueDate = "2023-12-01", + Notify = true + } + }; + + // Act + var service = new BulkWorkflowUpdateService(_serializer, _stack, updateBody); + + // Assert + Assert.IsNotNull(service); + Assert.AreEqual("/bulk/workflow", service.ResourcePath); + Assert.AreEqual("POST", service.HttpMethod); + } + + [TestMethod] + public void Test013_BulkWorkflowUpdateService_ContentBody() + { + // Arrange + var updateBody = new BulkWorkflowUpdateBody + { + Entries = new List + { + new BulkWorkflowEntry + { + Uid = "blt0e0945888fb09dea", + ContentType = "ct0", + Locale = "en-us" + } + }, + Workflow = new BulkWorkflowStage + { + Uid = "workflow_stage_uid", + Comment = "Test comment", + DueDate = "2023-12-01", + Notify = true + } + }; + + var service = new BulkWorkflowUpdateService(_serializer, _stack, updateBody); + + // Act + service.ContentBody(); + + // Assert + Assert.IsNotNull(service.ByteContent); + Assert.IsTrue(service.ByteContent.Length > 0); + + var json = Encoding.UTF8.GetString(service.ByteContent); + Assert.IsTrue(json.Contains("entries")); + Assert.IsTrue(json.Contains("workflow")); + } + + [TestMethod] + public void Test014_BulkJobStatusService_Initialization() + { + // Arrange + string jobId = "test_job_id"; + string bulkVersion = "1.0"; + + // Act + var service = new BulkJobStatusService(_serializer, _stack, jobId, bulkVersion); + + // Assert + Assert.IsNotNull(service); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + Assert.AreEqual("GET", service.HttpMethod); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual("1.0", service.Headers["bulk_version"]); + } + + [TestMethod] + public void Test015_BulkJobStatusService_Without_BulkVersion() + { + // Arrange + string jobId = "test_job_id"; + + // Act + var service = new BulkJobStatusService(_serializer, _stack, jobId); + + // Assert + Assert.IsNotNull(service); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + Assert.AreEqual("GET", service.HttpMethod); + Assert.IsFalse(service.Headers.ContainsKey("bulk_version")); + } + + [TestMethod] + public void Test016_BulkAddItemsService_Initialization() + { + // Arrange + var addItemsData = new BulkAddItemsData + { + Items = new List + { + new BulkAddItem + { + Uid = "uid", + ContentType = "ct_1" + } + } + }; + + // Act + var service = new BulkAddItemsService(_serializer, _stack, addItemsData, "1.0"); + + // Assert + Assert.IsNotNull(service); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + Assert.AreEqual("POST", service.HttpMethod); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual("1.0", service.Headers["bulk_version"]); + } + + [TestMethod] + public void Test017_BulkUpdateItemsService_Initialization() + { + // Arrange + var updateItemsData = new BulkAddItemsData + { + Items = new List + { + new BulkAddItem + { + Uid = "uid", + ContentType = "ct_1" + } + } + }; + + // Act + var service = new BulkUpdateItemsService(_serializer, _stack, updateItemsData, "1.0"); + + // Assert + Assert.IsNotNull(service); + Assert.AreEqual("/bulk/release/update_items", service.ResourcePath); + Assert.AreEqual("PUT", service.HttpMethod); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual("1.0", service.Headers["bulk_version"]); + } + + [TestMethod] + public void Test018_BulkReleaseItemsService_Null_Data_Throws_Exception() + { + // Arrange & Act & Assert + Assert.ThrowsException(() => + { + new BulkReleaseItemsService(_serializer, _stack, null); + }); + } + + [TestMethod] + public void Test019_BulkPublishService_Null_Data_Throws_Exception() + { + // Arrange & Act & Assert + Assert.ThrowsException(() => + { + new BulkPublishService(_serializer, _stack, null); + }); + } + + [TestMethod] + public void Test020_BulkDeleteService_Null_Data_Throws_Exception() + { + // Arrange & Act & Assert + Assert.ThrowsException(() => + { + new BulkDeleteService(_serializer, _stack, null); + }); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core/Models/BulkOperation.cs b/Contentstack.Management.Core/Models/BulkOperation.cs new file mode 100644 index 0000000..cf192cc --- /dev/null +++ b/Contentstack.Management.Core/Models/BulkOperation.cs @@ -0,0 +1,409 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Contentstack.Management.Core.Queryable; +using Contentstack.Management.Core.Services.Stack; +using Contentstack.Management.Core.Services.Stack.BulkOperation; +using Contentstack.Management.Core.Utils; + +namespace Contentstack.Management.Core.Models +{ + /// + /// Represents bulk operations for entries and assets in Contentstack. + /// + public class BulkOperation + { + private readonly Stack _stack; + + internal BulkOperation(Stack stack) + { + _stack = stack ?? throw new ArgumentNullException(nameof(stack)); + } + + /// + /// Publishes multiple entries and assets in bulk. + /// + /// The publish details containing entries, assets, locales, and environments. + /// Set to true to skip workflow stage checks. + /// Set to true to publish entries that don't require approval. + /// Set to true for nested publish operations. + /// The API version to use. + /// The + /// + ///

+        /// ContentstackClient client = new ContentstackClient("", "");
+        /// Stack stack = client.Stack("");
+        /// 
+        /// var publishDetails = new BulkPublishDetails
+        /// {
+        ///     Entries = new List
+        ///     {
+        ///         new BulkPublishEntry { Uid = "entry_uid", ContentTypeUid = "content_type_uid", Version = 1, Locale = "en-us" }
+        ///     },
+        ///     Assets = new List
+        ///     {
+        ///         new BulkPublishAsset { Uid = "asset_uid" }
+        ///     },
+        ///     Locales = new List { "en-us" },
+        ///     Environments = new List { "environment_uid" }
+        /// };
+        /// 
+        /// ContentstackResponse response = stack.BulkOperation().Publish(publishDetails);
+        /// 
+ ///
+ public ContentstackResponse Publish(BulkPublishDetails details, bool skipWorkflowStage = false, bool approvals = false, bool isNested = false, string apiVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkPublishService(_stack.client.serializer, _stack, details, skipWorkflowStage, approvals, isNested); + return _stack.client.InvokeSync(service, false, apiVersion); + } + + /// + /// Publishes multiple entries and assets in bulk asynchronously. + /// + /// The publish details containing entries, assets, locales, and environments. + /// Set to true to skip workflow stage checks. + /// Set to true to publish entries that don't require approval. + /// Set to true for nested publish operations. + /// The API version to use. + /// The Task + public Task PublishAsync(BulkPublishDetails details, bool skipWorkflowStage = false, bool approvals = false, bool isNested = false, string apiVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkPublishService(_stack.client.serializer, _stack, details, skipWorkflowStage, approvals, isNested); + return _stack.client.InvokeAsync(service, false, apiVersion); + } + + /// + /// Unpublishes multiple entries and assets in bulk. + /// + /// The unpublish details containing entries, assets, locales, and environments. + /// Set to true to skip workflow stage checks. + /// Set to true to unpublish entries that don't require approval. + /// Set to true for nested unpublish operations. + /// The API version to use. + /// The + /// + ///

+        /// ContentstackClient client = new ContentstackClient("", "");
+        /// Stack stack = client.Stack("");
+        /// 
+        /// var unpublishDetails = new BulkPublishDetails
+        /// {
+        ///     Entries = new List
+        ///     {
+        ///         new BulkPublishEntry { Uid = "entry_uid", ContentTypeUid = "content_type_uid", Locale = "en-us" }
+        ///     },
+        ///     Assets = new List
+        ///     {
+        ///         new BulkPublishAsset { Uid = "asset_uid" }
+        ///     },
+        ///     Locales = new List { "en-us" },
+        ///     Environments = new List { "environment_uid" }
+        /// };
+        /// 
+        /// ContentstackResponse response = stack.BulkOperation().Unpublish(unpublishDetails);
+        /// 
+ ///
+ public ContentstackResponse Unpublish(BulkPublishDetails details, bool skipWorkflowStage = false, bool approvals = false, bool isNested = false, string apiVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkUnpublishService(_stack.client.serializer, _stack, details, skipWorkflowStage, approvals, isNested); + return _stack.client.InvokeSync(service, false, apiVersion); + } + + /// + /// Unpublishes multiple entries and assets in bulk asynchronously. + /// + /// The unpublish details containing entries, assets, locales, and environments. + /// Set to true to skip workflow stage checks. + /// Set to true to unpublish entries that don't require approval. + /// Set to true for nested unpublish operations. + /// The API version to use. + /// The Task + public Task UnpublishAsync(BulkPublishDetails details, bool skipWorkflowStage = false, bool approvals = false, bool isNested = false, string apiVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkUnpublishService(_stack.client.serializer, _stack, details, skipWorkflowStage, approvals, isNested); + return _stack.client.InvokeAsync(service, false, apiVersion); + } + + /// + /// Deletes multiple entries and assets in bulk. + /// + /// The delete details containing entries and assets to delete. + /// The + /// + ///

+        /// ContentstackClient client = new ContentstackClient("", "");
+        /// Stack stack = client.Stack("");
+        /// 
+        /// var deleteDetails = new BulkDeleteDetails
+        /// {
+        ///     Entries = new List
+        ///     {
+        ///         new BulkDeleteEntry { Uid = "entry_uid", ContentType = "content_type_uid", Locale = "en-us" }
+        ///     },
+        ///     Assets = new List
+        ///     {
+        ///         new BulkDeleteAsset { Uid = "asset_uid" }
+        ///     }
+        /// };
+        /// 
+        /// ContentstackResponse response = stack.BulkOperation().Delete(deleteDetails);
+        /// 
+ ///
+ public ContentstackResponse Delete(BulkDeleteDetails details) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkDeleteService(_stack.client.serializer, _stack, details); + return _stack.client.InvokeSync(service); + } + + /// + /// Deletes multiple entries and assets in bulk asynchronously. + /// + /// The delete details containing entries and assets to delete. + /// The Task + public Task DeleteAsync(BulkDeleteDetails details) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkDeleteService(_stack.client.serializer, _stack, details); + return _stack.client.InvokeAsync(service); + } + + /// + /// Updates workflow stages for multiple entries in bulk. + /// + /// The update body containing entries and workflow information. + /// The + /// + ///

+        /// ContentstackClient client = new ContentstackClient("", "");
+        /// Stack stack = client.Stack("");
+        /// 
+        /// var updateBody = new BulkWorkflowUpdateBody
+        /// {
+        ///     Entries = new List
+        ///     {
+        ///         new BulkWorkflowEntry { Uid = "entry_uid", ContentType = "content_type_uid", Locale = "en-us" }
+        ///     },
+        ///     Workflow = new BulkWorkflowStage
+        ///     {
+        ///         Comment = "Workflow-related Comments",
+        ///         DueDate = "Thu Dec 01 2018",
+        ///         Notify = false,
+        ///         Uid = "workflow_stage_uid"
+        ///     }
+        /// };
+        /// 
+        /// ContentstackResponse response = stack.BulkOperation().Update(updateBody);
+        /// 
+ ///
+ public ContentstackResponse Update(BulkWorkflowUpdateBody updateBody) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkWorkflowUpdateService(_stack.client.serializer, _stack, updateBody); + return _stack.client.InvokeSync(service); + } + + /// + /// Updates workflow stages for multiple entries in bulk asynchronously. + /// + /// The update body containing entries and workflow information. + /// The Task + public Task UpdateAsync(BulkWorkflowUpdateBody updateBody) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkWorkflowUpdateService(_stack.client.serializer, _stack, updateBody); + return _stack.client.InvokeAsync(service); + } + + /// + /// Adds multiple items to a release in bulk. + /// + /// The data containing items to be added to the release. + /// The bulk version. + /// The + /// + ///

+        /// ContentstackClient client = new ContentstackClient("", "");
+        /// Stack stack = client.Stack("");
+        /// 
+        /// var itemsData = new BulkAddItemsData
+        /// {
+        ///     Items = new List
+        ///     {
+        ///         new BulkAddItem { Uid = "entry_uid", ContentType = "content_type_uid" }
+        ///     }
+        /// };
+        /// 
+        /// ContentstackResponse response = stack.BulkOperation().AddItems(itemsData, "1.0");
+        /// 
+ ///
+ public ContentstackResponse AddItems(BulkAddItemsData data, string bulkVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkAddItemsService(_stack.client.serializer, _stack, data, bulkVersion); + return _stack.client.InvokeSync(service); + } + + /// + /// Adds multiple items to a release in bulk asynchronously. + /// + /// The data containing items to be added to the release. + /// The bulk version. + /// The Task + public Task AddItemsAsync(BulkAddItemsData data, string bulkVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkAddItemsService(_stack.client.serializer, _stack, data, bulkVersion); + return _stack.client.InvokeAsync(service); + } + + /// + /// Updates multiple items in a release in bulk. + /// + /// The data containing items to be updated in the release. + /// The bulk version. + /// The + public ContentstackResponse UpdateItems(BulkAddItemsData data, string bulkVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkUpdateItemsService(_stack.client.serializer, _stack, data, bulkVersion); + return _stack.client.InvokeSync(service); + } + + /// + /// Updates multiple items in a release in bulk asynchronously. + /// + /// The data containing items to be updated in the release. + /// The bulk version. + /// The Task + public Task UpdateItemsAsync(BulkAddItemsData data, string bulkVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkUpdateItemsService(_stack.client.serializer, _stack, data, bulkVersion); + return _stack.client.InvokeAsync(service); + } + + /// + /// Checks the status of a bulk job. + /// + /// The ID of the job. + /// The bulk version. + /// The + /// + ///

+        /// ContentstackClient client = new ContentstackClient("", "");
+        /// Stack stack = client.Stack("");
+        /// 
+        /// ContentstackResponse response = stack.BulkOperation().JobStatus("job_id", "1.0");
+        /// 
+ ///
+ public ContentstackResponse JobStatus(string jobId, string bulkVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkJobStatusService(_stack.client.serializer, _stack, jobId, bulkVersion); + return _stack.client.InvokeSync(service); + } + + /// + /// Checks the status of a bulk job asynchronously. + /// + /// The ID of the job. + /// The bulk version. + /// The Task + public Task JobStatusAsync(string jobId, string bulkVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkJobStatusService(_stack.client.serializer, _stack, jobId, bulkVersion); + return _stack.client.InvokeAsync(service); + } + + /// + /// Performs bulk release items operations with complete request body structure. + /// + /// The release items data containing release, action, locale, reference, and items. + /// The bulk version. + /// The + /// + ///

+        /// ContentstackClient client = new ContentstackClient("", "");
+        /// Stack stack = client.Stack("");
+        /// 
+        /// var releaseData = new BulkReleaseItemsData
+        /// {
+        ///     Release = "release_uid",
+        ///     Action = "publish",
+        ///     Locale = new List { "en-us" },
+        ///     Reference = true,
+        ///     Items = new List
+        ///     {
+        ///         new BulkReleaseItem
+        ///         {
+        ///             ContentTypeUid = "ct_1",
+        ///             Uid = "uid",
+        ///             Version = 2,
+        ///             Locale = "en-us",
+        ///             Title = "validation test"
+        ///         }
+        ///     }
+        /// };
+        /// 
+        /// ContentstackResponse response = stack.BulkOperation().ReleaseItems(releaseData);
+        /// 
+ ///
+ public ContentstackResponse ReleaseItems(BulkReleaseItemsData data, string bulkVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkReleaseItemsService(_stack.client.serializer, _stack, data, bulkVersion); + return _stack.client.InvokeSync(service); + } + + /// + /// Performs bulk release items operations with complete request body structure asynchronously. + /// + /// The release items data containing release, action, locale, reference, and items. + /// The bulk version. + /// The Task + public Task ReleaseItemsAsync(BulkReleaseItemsData data, string bulkVersion = null) + { + _stack.ThrowIfNotLoggedIn(); + _stack.ThrowIfAPIKeyEmpty(); + + var service = new BulkReleaseItemsService(_stack.client.serializer, _stack, data, bulkVersion); + return _stack.client.InvokeAsync(service); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core/Models/BulkOperationModels.cs b/Contentstack.Management.Core/Models/BulkOperationModels.cs new file mode 100644 index 0000000..1c57259 --- /dev/null +++ b/Contentstack.Management.Core/Models/BulkOperationModels.cs @@ -0,0 +1,389 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Models +{ + /// + /// Represents details for bulk publish/unpublish operations. + /// + public class BulkPublishDetails + { + /// + /// Gets or sets the list of entries to publish/unpublish. + /// + [JsonProperty("entries")] + public List Entries { get; set; } = new List(); + + /// + /// Gets or sets the list of assets to publish/unpublish. + /// + [JsonProperty("assets")] + public List Assets { get; set; } = new List(); + + /// + /// Gets or sets the list of locales. + /// + [JsonProperty("locales")] + public List Locales { get; set; } = new List(); + + /// + /// Gets or sets the list of environments. + /// + [JsonProperty("environments")] + public List Environments { get; set; } = new List(); + + /// + /// Gets or sets the rules for the bulk operation. + /// + [JsonProperty("rules")] + public BulkPublishRules Rules { get; set; } + + /// + /// Gets or sets the scheduled time for the operation. + /// + [JsonProperty("scheduled_at")] + public string ScheduledAt { get; set; } + + /// + /// Gets or sets whether to publish with reference. + /// + [JsonProperty("publish_with_reference")] + public bool PublishWithReference { get; set; } + } + + /// + /// Represents an entry for bulk publish/unpublish operations. + /// + public class BulkPublishEntry + { + /// + /// Gets or sets the entry UID. + /// + [JsonProperty("uid")] + public string Uid { get; set; } + + /// + /// Gets or sets the content type. + /// + [JsonProperty("content_type")] + public string ContentType { get; set; } + + /// + /// Gets or sets the version number. + /// + [JsonProperty("version")] + public int Version { get; set; } + + /// + /// Gets or sets the locale. + /// + [JsonProperty("locale")] + public string Locale { get; set; } + } + + /// + /// Represents rules for bulk publish operations. + /// + public class BulkPublishRules + { + /// + /// Gets or sets the approvals setting. + /// + [JsonProperty("approvals")] + public string Approvals { get; set; } + } + + /// + /// Represents an asset for bulk publish/unpublish operations. + /// + public class BulkPublishAsset + { + /// + /// Gets or sets the asset UID. + /// + [JsonProperty("uid")] + public string Uid { get; set; } + } + + /// + /// Represents details for bulk delete operations. + /// + public class BulkDeleteDetails + { + /// + /// Gets or sets the list of entries to delete. + /// + [JsonProperty("entries")] + public List Entries { get; set; } = new List(); + + /// + /// Gets or sets the list of assets to delete. + /// + [JsonProperty("assets")] + public List Assets { get; set; } = new List(); + } + + /// + /// Represents an entry for bulk delete operations. + /// + public class BulkDeleteEntry + { + /// + /// Gets or sets the entry UID. + /// + [JsonProperty("uid")] + public string Uid { get; set; } + + /// + /// Gets or sets the content type. + /// + [JsonProperty("content_type")] + public string ContentType { get; set; } + + /// + /// Gets or sets the locale. + /// + [JsonProperty("locale")] + public string Locale { get; set; } + } + + /// + /// Represents an asset for bulk delete operations. + /// + public class BulkDeleteAsset + { + /// + /// Gets or sets the asset UID. + /// + [JsonProperty("uid")] + public string Uid { get; set; } + } + + /// + /// Represents the body for bulk workflow update operations. + /// + public class BulkWorkflowUpdateBody + { + /// + /// Gets or sets the list of entries to update. + /// + [JsonProperty("entries")] + public List Entries { get; set; } = new List(); + + /// + /// Gets or sets the workflow stage information. + /// + [JsonProperty("workflow")] + public BulkWorkflowStage Workflow { get; set; } + } + + /// + /// Represents an entry for bulk workflow update operations. + /// + public class BulkWorkflowEntry + { + /// + /// Gets or sets the entry UID. + /// + [JsonProperty("uid")] + public string Uid { get; set; } + + /// + /// Gets or sets the content type. + /// + [JsonProperty("content_type")] + public string ContentType { get; set; } + + /// + /// Gets or sets the locale. + /// + [JsonProperty("locale")] + public string Locale { get; set; } + } + + /// + /// Represents workflow stage information for bulk operations. + /// + public class BulkWorkflowStage + { + /// + /// Gets or sets the workflow stage UID. + /// + [JsonProperty("uid")] + public string Uid { get; set; } + + /// + /// Gets or sets the comment. + /// + [JsonProperty("comment")] + public string Comment { get; set; } + + /// + /// Gets or sets the due date. + /// + [JsonProperty("due_date")] + public string DueDate { get; set; } + + /// + /// Gets or sets whether to notify. + /// + [JsonProperty("notify")] + public bool Notify { get; set; } + + /// + /// Gets or sets the list of assigned users. + /// + [JsonProperty("assigned_to")] + public List AssignedTo { get; set; } = new List(); + + /// + /// Gets or sets the list of assigned roles. + /// + [JsonProperty("assigned_by_roles")] + public List AssignedByRoles { get; set; } = new List(); + } + + /// + /// Represents a user assigned to a workflow stage. + /// + public class BulkWorkflowUser + { + /// + /// Gets or sets the user UID. + /// + [JsonProperty("uid")] + public string Uid { get; set; } + + /// + /// Gets or sets the user name. + /// + [JsonProperty("name")] + public string Name { get; set; } + + /// + /// Gets or sets the user email. + /// + [JsonProperty("email")] + public string Email { get; set; } + } + + /// + /// Represents a role assigned to a workflow stage. + /// + public class BulkWorkflowRole + { + /// + /// Gets or sets the role UID. + /// + [JsonProperty("uid")] + public string Uid { get; set; } + + /// + /// Gets or sets the role name. + /// + [JsonProperty("name")] + public string Name { get; set; } + } + + /// + /// Represents data for bulk add/update items operations. + /// + public class BulkAddItemsData + { + /// + /// Gets or sets the list of items to add/update. + /// + [JsonProperty("items")] + public List Items { get; set; } = new List(); + } + + /// + /// Represents an item for bulk add/update operations. + /// + public class BulkAddItem + { + /// + /// Gets or sets the item UID. + /// + [JsonProperty("uid")] + public string Uid { get; set; } + + /// + /// Gets or sets the content type. + /// + [JsonProperty("content_type")] + public string ContentType { get; set; } + } + + /// + /// Represents data for bulk release items operations with complete request body structure. + /// + public class BulkReleaseItemsData + { + /// + /// Gets or sets the release UID. + /// + [JsonProperty("release")] + public string Release { get; set; } + + /// + /// Gets or sets the action to perform (publish, unpublish, etc.). + /// + [JsonProperty("action")] + public string Action { get; set; } + + /// + /// Gets or sets the list of locales. + /// + [JsonProperty("locale")] + public List Locale { get; set; } = new List(); + + /// + /// Gets or sets the reference flag. + /// + [JsonProperty("reference")] + public bool Reference { get; set; } + + /// + /// Gets or sets the list of items to process. + /// + [JsonProperty("items")] + public List Items { get; set; } = new List(); + } + + /// + /// Represents an item for bulk release operations with enhanced properties. + /// + public class BulkReleaseItem + { + /// + /// Gets or sets the content type UID. + /// + [JsonProperty("content_type_uid")] + public string ContentTypeUid { get; set; } + + /// + /// Gets or sets the item UID. + /// + [JsonProperty("uid")] + public string Uid { get; set; } + + /// + /// Gets or sets the version number. + /// + [JsonProperty("version")] + public int Version { get; set; } + + /// + /// Gets or sets the locale. + /// + [JsonProperty("locale")] + public string Locale { get; set; } + + /// + /// Gets or sets the title. + /// + [JsonProperty("title")] + public string Title { get; set; } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core/Models/Stack.cs b/Contentstack.Management.Core/Models/Stack.cs index bd461f4..8695e05 100644 --- a/Contentstack.Management.Core/Models/Stack.cs +++ b/Contentstack.Management.Core/Models/Stack.cs @@ -883,6 +883,36 @@ public AuditLog AuditLog(string uid = null) return new AuditLog(this, uid); } + + /// + /// Gets the bulk operation instance for performing bulk operations on entries and assets. + /// + /// + ///

+        /// ContentstackClient client = new ContentstackClient("", "");
+        /// Stack stack = client.Stack("");
+        /// 
+        /// var publishDetails = new BulkPublishDetails
+        /// {
+        ///     Entries = new List
+        ///     {
+        ///         new BulkPublishEntry { Uid = "entry_uid", ContentTypeUid = "content_type_uid", Locale = "en-us" }
+        ///     },
+        ///     Locales = new List { "en-us" },
+        ///     Environments = new List { "environment_uid" }
+        /// };
+        /// 
+        /// ContentstackResponse response = stack.BulkOperation().Publish(publishDetails);
+        /// 
+ ///
+ /// The + public BulkOperation BulkOperation() + { + ThrowIfNotLoggedIn(); + ThrowIfAPIKeyEmpty(); + + return new BulkOperation(this); + } #endregion #region Throw Error diff --git a/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkAddItemsService.cs b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkAddItemsService.cs new file mode 100644 index 0000000..4cca17d --- /dev/null +++ b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkAddItemsService.cs @@ -0,0 +1,51 @@ +using System; +using System.Text; +using Newtonsoft.Json; +using Contentstack.Management.Core.Models; + +namespace Contentstack.Management.Core.Services.Stack.BulkOperation +{ + /// + /// Service for bulk add items operations. + /// + internal class BulkAddItemsService : ContentstackService + { + private readonly BulkAddItemsData _data; + private readonly string _bulkVersion; + + /// + /// Initializes a new instance of the class. + /// + /// The JSON serializer. + /// The stack instance. + /// The add items data. + /// The bulk version. + public BulkAddItemsService(JsonSerializer serializer, Contentstack.Management.Core.Models.Stack stack, BulkAddItemsData data, string bulkVersion = null) + : base(serializer, stack) + { + _data = data ?? throw new ArgumentNullException(nameof(data)); + _bulkVersion = bulkVersion; + + ResourcePath = "/bulk/release/items"; + HttpMethod = "POST"; + + // Set bulk version header if provided + if (!string.IsNullOrEmpty(_bulkVersion)) + { + Headers["bulk_version"] = _bulkVersion; + } + } + + /// + /// Creates the content body for the request. + /// + public override void ContentBody() + { + if (_data != null) + { + var json = JsonConvert.SerializeObject(_data); + ByteContent = Encoding.UTF8.GetBytes(json); + } + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkDeleteService.cs b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkDeleteService.cs new file mode 100644 index 0000000..0222ccb --- /dev/null +++ b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkDeleteService.cs @@ -0,0 +1,42 @@ +using System; +using System.Text; +using Newtonsoft.Json; +using Contentstack.Management.Core.Models; + +namespace Contentstack.Management.Core.Services.Stack.BulkOperation +{ + /// + /// Service for bulk delete operations. + /// + internal class BulkDeleteService : ContentstackService + { + private readonly BulkDeleteDetails _details; + + /// + /// Initializes a new instance of the class. + /// + /// The JSON serializer. + /// The stack instance. + /// The delete details. + public BulkDeleteService(JsonSerializer serializer, Contentstack.Management.Core.Models.Stack stack, BulkDeleteDetails details) + : base(serializer, stack) + { + _details = details ?? throw new ArgumentNullException(nameof(details)); + + ResourcePath = "/bulk/delete"; + HttpMethod = "POST"; + } + + /// + /// Creates the content body for the request. + /// + public override void ContentBody() + { + if (_details != null) + { + var json = JsonConvert.SerializeObject(_details); + ByteContent = Encoding.UTF8.GetBytes(json); + } + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkJobStatusService.cs b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkJobStatusService.cs new file mode 100644 index 0000000..0d273d4 --- /dev/null +++ b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkJobStatusService.cs @@ -0,0 +1,38 @@ +using System; +using Newtonsoft.Json; +using Contentstack.Management.Core.Models; + +namespace Contentstack.Management.Core.Services.Stack.BulkOperation +{ + /// + /// Service for bulk job status operations. + /// + internal class BulkJobStatusService : ContentstackService + { + private readonly string _jobId; + private readonly string _bulkVersion; + + /// + /// Initializes a new instance of the class. + /// + /// The JSON serializer. + /// The stack instance. + /// The job ID. + /// The bulk version. + public BulkJobStatusService(JsonSerializer serializer, Contentstack.Management.Core.Models.Stack stack, string jobId, string bulkVersion = null) + : base(serializer, stack) + { + _jobId = jobId ?? throw new ArgumentNullException(nameof(jobId)); + _bulkVersion = bulkVersion; + + ResourcePath = $"/bulk/jobs/{_jobId}"; + HttpMethod = "GET"; + + // Set bulk version header if provided + if (!string.IsNullOrEmpty(_bulkVersion)) + { + Headers["bulk_version"] = _bulkVersion; + } + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkPublishService.cs b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkPublishService.cs new file mode 100644 index 0000000..1aa6c87 --- /dev/null +++ b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkPublishService.cs @@ -0,0 +1,68 @@ +using System; +using System.Text; +using Newtonsoft.Json; +using Contentstack.Management.Core.Models; + +namespace Contentstack.Management.Core.Services.Stack.BulkOperation +{ + /// + /// Service for bulk publish operations. + /// + internal class BulkPublishService : ContentstackService + { + private readonly BulkPublishDetails _details; + private readonly bool _skipWorkflowStage; + private readonly bool _approvals; + private readonly bool _isNested; + + /// + /// Initializes a new instance of the class. + /// + /// The JSON serializer. + /// The stack instance. + /// The publish details. + /// Whether to skip workflow stage checks. + /// Whether to include approvals. + /// Whether this is a nested operation. + public BulkPublishService(JsonSerializer serializer, Contentstack.Management.Core.Models.Stack stack, BulkPublishDetails details, bool skipWorkflowStage = false, bool approvals = false, bool isNested = false) + : base(serializer, stack) + { + _details = details ?? throw new ArgumentNullException(nameof(details)); + _skipWorkflowStage = skipWorkflowStage; + _approvals = approvals; + _isNested = isNested; + + ResourcePath = "/bulk/publish"; + HttpMethod = "POST"; + + // Set headers based on parameters + if (_skipWorkflowStage) + { + Headers["skip_workflow_stage_check"] = "true"; + } + + if (_approvals) + { + Headers["approvals"] = "true"; + } + + if (_isNested) + { + AddQueryResource("nested", "true"); + AddQueryResource("event_type", "bulk"); + } + } + + /// + /// Creates the content body for the request. + /// + public override void ContentBody() + { + if (_details != null) + { + var json = JsonConvert.SerializeObject(_details); + ByteContent = Encoding.UTF8.GetBytes(json); + } + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkReleaseItemsService.cs b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkReleaseItemsService.cs new file mode 100644 index 0000000..6127c3e --- /dev/null +++ b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkReleaseItemsService.cs @@ -0,0 +1,51 @@ +using System; +using System.Text; +using Newtonsoft.Json; +using Contentstack.Management.Core.Models; + +namespace Contentstack.Management.Core.Services.Stack.BulkOperation +{ + /// + /// Service for bulk release items operations with complete request body structure. + /// + internal class BulkReleaseItemsService : ContentstackService + { + private readonly BulkReleaseItemsData _data; + private readonly string _bulkVersion; + + /// + /// Initializes a new instance of the class. + /// + /// The JSON serializer. + /// The stack instance. + /// The release items data. + /// The bulk version. + public BulkReleaseItemsService(JsonSerializer serializer, Contentstack.Management.Core.Models.Stack stack, BulkReleaseItemsData data, string bulkVersion = null) + : base(serializer, stack) + { + _data = data ?? throw new ArgumentNullException(nameof(data)); + _bulkVersion = bulkVersion; + + ResourcePath = "/bulk/release/items"; + HttpMethod = "POST"; + + // Set bulk version header if provided + if (!string.IsNullOrEmpty(_bulkVersion)) + { + Headers["bulk_version"] = _bulkVersion; + } + } + + /// + /// Creates the content body for the request. + /// + public override void ContentBody() + { + if (_data != null) + { + var json = JsonConvert.SerializeObject(_data); + ByteContent = Encoding.UTF8.GetBytes(json); + } + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkUnpublishService.cs b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkUnpublishService.cs new file mode 100644 index 0000000..8d9689d --- /dev/null +++ b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkUnpublishService.cs @@ -0,0 +1,68 @@ +using System; +using System.Text; +using Newtonsoft.Json; +using Contentstack.Management.Core.Models; + +namespace Contentstack.Management.Core.Services.Stack.BulkOperation +{ + /// + /// Service for bulk unpublish operations. + /// + internal class BulkUnpublishService : ContentstackService + { + private readonly BulkPublishDetails _details; + private readonly bool _skipWorkflowStage; + private readonly bool _approvals; + private readonly bool _isNested; + + /// + /// Initializes a new instance of the class. + /// + /// The JSON serializer. + /// The stack instance. + /// The unpublish details. + /// Whether to skip workflow stage checks. + /// Whether to include approvals. + /// Whether this is a nested operation. + public BulkUnpublishService(JsonSerializer serializer, Contentstack.Management.Core.Models.Stack stack, BulkPublishDetails details, bool skipWorkflowStage = false, bool approvals = false, bool isNested = false) + : base(serializer, stack) + { + _details = details ?? throw new ArgumentNullException(nameof(details)); + _skipWorkflowStage = skipWorkflowStage; + _approvals = approvals; + _isNested = isNested; + + ResourcePath = "/bulk/unpublish"; + HttpMethod = "POST"; + + // Set headers based on parameters + if (_skipWorkflowStage) + { + Headers["skip_workflow_stage_check"] = "true"; + } + + if (_approvals) + { + Headers["approvals"] = "true"; + } + + if (_isNested) + { + AddQueryResource("nested", "true"); + AddQueryResource("event_type", "bulk"); + } + } + + /// + /// Creates the content body for the request. + /// + public override void ContentBody() + { + if (_details != null) + { + var json = JsonConvert.SerializeObject(_details); + ByteContent = Encoding.UTF8.GetBytes(json); + } + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkUpdateItemsService.cs b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkUpdateItemsService.cs new file mode 100644 index 0000000..0d118cc --- /dev/null +++ b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkUpdateItemsService.cs @@ -0,0 +1,51 @@ +using System; +using System.Text; +using Newtonsoft.Json; +using Contentstack.Management.Core.Models; + +namespace Contentstack.Management.Core.Services.Stack.BulkOperation +{ + /// + /// Service for bulk update items operations. + /// + internal class BulkUpdateItemsService : ContentstackService + { + private readonly BulkAddItemsData _data; + private readonly string _bulkVersion; + + /// + /// Initializes a new instance of the class. + /// + /// The JSON serializer. + /// The stack instance. + /// The update items data. + /// The bulk version. + public BulkUpdateItemsService(JsonSerializer serializer, Contentstack.Management.Core.Models.Stack stack, BulkAddItemsData data, string bulkVersion = null) + : base(serializer, stack) + { + _data = data ?? throw new ArgumentNullException(nameof(data)); + _bulkVersion = bulkVersion; + + ResourcePath = "/bulk/release/update_items"; + HttpMethod = "PUT"; + + // Set bulk version header if provided + if (!string.IsNullOrEmpty(_bulkVersion)) + { + Headers["bulk_version"] = _bulkVersion; + } + } + + /// + /// Creates the content body for the request. + /// + public override void ContentBody() + { + if (_data != null) + { + var json = JsonConvert.SerializeObject(_data); + ByteContent = Encoding.UTF8.GetBytes(json); + } + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkWorkflowUpdateService.cs b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkWorkflowUpdateService.cs new file mode 100644 index 0000000..7162eeb --- /dev/null +++ b/Contentstack.Management.Core/Services/Stack/BulkOperation/BulkWorkflowUpdateService.cs @@ -0,0 +1,42 @@ +using System; +using System.Text; +using Newtonsoft.Json; +using Contentstack.Management.Core.Models; + +namespace Contentstack.Management.Core.Services.Stack.BulkOperation +{ + /// + /// Service for bulk workflow update operations. + /// + internal class BulkWorkflowUpdateService : ContentstackService + { + private readonly BulkWorkflowUpdateBody _updateBody; + + /// + /// Initializes a new instance of the class. + /// + /// The JSON serializer. + /// The stack instance. + /// The workflow update body. + public BulkWorkflowUpdateService(JsonSerializer serializer, Contentstack.Management.Core.Models.Stack stack, BulkWorkflowUpdateBody updateBody) + : base(serializer, stack) + { + _updateBody = updateBody ?? throw new ArgumentNullException(nameof(updateBody)); + + ResourcePath = "/bulk/workflow"; + HttpMethod = "POST"; + } + + /// + /// Creates the content body for the request. + /// + public override void ContentBody() + { + if (_updateBody != null) + { + var json = JsonConvert.SerializeObject(_updateBody); + ByteContent = Encoding.UTF8.GetBytes(json); + } + } + } +} \ No newline at end of file From 6207b01ce28b9f2f6c1a4bef3b1688e73365c92e Mon Sep 17 00:00:00 2001 From: raj pandey Date: Mon, 14 Jul 2025 22:34:05 +0530 Subject: [PATCH 2/3] Updated Request Body --- .../Models/BulkOperationModels.cs | 206 +++++++++++++----- 1 file changed, 148 insertions(+), 58 deletions(-) diff --git a/Contentstack.Management.Core/Models/BulkOperationModels.cs b/Contentstack.Management.Core/Models/BulkOperationModels.cs index 1c57259..b2f5faa 100644 --- a/Contentstack.Management.Core/Models/BulkOperationModels.cs +++ b/Contentstack.Management.Core/Models/BulkOperationModels.cs @@ -11,44 +11,62 @@ public class BulkPublishDetails /// /// Gets or sets the list of entries to publish/unpublish. /// - [JsonProperty("entries")] - public List Entries { get; set; } = new List(); + [JsonProperty(propertyName: "entries")] + public List Entries { get; set; } /// /// Gets or sets the list of assets to publish/unpublish. /// - [JsonProperty("assets")] - public List Assets { get; set; } = new List(); + [JsonProperty(propertyName: "assets")] + public List Assets { get; set; } /// /// Gets or sets the list of locales. /// - [JsonProperty("locales")] + [JsonProperty(propertyName: "locales")] public List Locales { get; set; } = new List(); /// /// Gets or sets the list of environments. /// - [JsonProperty("environments")] + [JsonProperty(propertyName: "environments")] public List Environments { get; set; } = new List(); /// /// Gets or sets the rules for the bulk operation. /// - [JsonProperty("rules")] + [JsonProperty(propertyName: "rules")] public BulkPublishRules Rules { get; set; } /// /// Gets or sets the scheduled time for the operation. /// - [JsonProperty("scheduled_at")] + [JsonProperty(propertyName: "scheduled_at")] public string ScheduledAt { get; set; } /// /// Gets or sets whether to publish with reference. /// - [JsonProperty("publish_with_reference")] + [JsonProperty(propertyName: "publish_with_reference")] public bool PublishWithReference { get; set; } + + /// + /// Determines whether to serialize the Entries property. + /// + /// True if Entries should be serialized, false otherwise. + public bool ShouldSerializeEntries() + { + return Entries != null && Entries.Count > 0; + } + + /// + /// Determines whether to serialize the Assets property. + /// + /// True if Assets should be serialized, false otherwise. + public bool ShouldSerializeAssets() + { + return Assets != null && Assets.Count > 0; + } } /// @@ -59,25 +77,25 @@ public class BulkPublishEntry /// /// Gets or sets the entry UID. /// - [JsonProperty("uid")] + [JsonProperty(propertyName: "uid")] public string Uid { get; set; } /// /// Gets or sets the content type. /// - [JsonProperty("content_type")] + [JsonProperty(propertyName: "content_type")] public string ContentType { get; set; } /// /// Gets or sets the version number. /// - [JsonProperty("version")] + [JsonProperty(propertyName: "version")] public int Version { get; set; } /// /// Gets or sets the locale. /// - [JsonProperty("locale")] + [JsonProperty(propertyName: "locale")] public string Locale { get; set; } } @@ -89,7 +107,7 @@ public class BulkPublishRules /// /// Gets or sets the approvals setting. /// - [JsonProperty("approvals")] + [JsonProperty(propertyName: "approvals")] public string Approvals { get; set; } } @@ -101,7 +119,7 @@ public class BulkPublishAsset /// /// Gets or sets the asset UID. /// - [JsonProperty("uid")] + [JsonProperty(propertyName: "uid")] public string Uid { get; set; } } @@ -113,14 +131,32 @@ public class BulkDeleteDetails /// /// Gets or sets the list of entries to delete. /// - [JsonProperty("entries")] - public List Entries { get; set; } = new List(); + [JsonProperty(propertyName: "entries")] + public List Entries { get; set; } /// /// Gets or sets the list of assets to delete. /// - [JsonProperty("assets")] - public List Assets { get; set; } = new List(); + [JsonProperty(propertyName: "assets")] + public List Assets { get; set; } + + /// + /// Determines whether to serialize the Entries property. + /// + /// True if Entries should be serialized, false otherwise. + public bool ShouldSerializeEntries() + { + return Entries != null && Entries.Count > 0; + } + + /// + /// Determines whether to serialize the Assets property. + /// + /// True if Assets should be serialized, false otherwise. + public bool ShouldSerializeAssets() + { + return Assets != null && Assets.Count > 0; + } } /// @@ -131,19 +167,19 @@ public class BulkDeleteEntry /// /// Gets or sets the entry UID. /// - [JsonProperty("uid")] + [JsonProperty(propertyName: "uid")] public string Uid { get; set; } /// /// Gets or sets the content type. /// - [JsonProperty("content_type")] + [JsonProperty(propertyName: "content_type")] public string ContentType { get; set; } /// /// Gets or sets the locale. /// - [JsonProperty("locale")] + [JsonProperty(propertyName: "locale")] public string Locale { get; set; } } @@ -155,7 +191,7 @@ public class BulkDeleteAsset /// /// Gets or sets the asset UID. /// - [JsonProperty("uid")] + [JsonProperty(propertyName: "uid")] public string Uid { get; set; } } @@ -167,14 +203,23 @@ public class BulkWorkflowUpdateBody /// /// Gets or sets the list of entries to update. /// - [JsonProperty("entries")] - public List Entries { get; set; } = new List(); + [JsonProperty(propertyName: "entries")] + public List Entries { get; set; } /// /// Gets or sets the workflow stage information. /// - [JsonProperty("workflow")] + [JsonProperty(propertyName: "workflow")] public BulkWorkflowStage Workflow { get; set; } + + /// + /// Determines whether to serialize the Entries property. + /// + /// True if Entries should be serialized, false otherwise. + public bool ShouldSerializeEntries() + { + return Entries != null && Entries.Count > 0; + } } /// @@ -185,19 +230,19 @@ public class BulkWorkflowEntry /// /// Gets or sets the entry UID. /// - [JsonProperty("uid")] + [JsonProperty(propertyName: "uid")] public string Uid { get; set; } /// /// Gets or sets the content type. /// - [JsonProperty("content_type")] + [JsonProperty(propertyName: "content_type")] public string ContentType { get; set; } /// /// Gets or sets the locale. /// - [JsonProperty("locale")] + [JsonProperty(propertyName: "locale")] public string Locale { get; set; } } @@ -209,38 +254,56 @@ public class BulkWorkflowStage /// /// Gets or sets the workflow stage UID. /// - [JsonProperty("uid")] + [JsonProperty(propertyName: "uid")] public string Uid { get; set; } /// /// Gets or sets the comment. /// - [JsonProperty("comment")] + [JsonProperty(propertyName: "comment")] public string Comment { get; set; } /// /// Gets or sets the due date. /// - [JsonProperty("due_date")] + [JsonProperty(propertyName: "due_date")] public string DueDate { get; set; } /// /// Gets or sets whether to notify. /// - [JsonProperty("notify")] + [JsonProperty(propertyName: "notify")] public bool Notify { get; set; } /// /// Gets or sets the list of assigned users. /// - [JsonProperty("assigned_to")] - public List AssignedTo { get; set; } = new List(); + [JsonProperty(propertyName: "assigned_to")] + public List AssignedTo { get; set; } /// /// Gets or sets the list of assigned roles. /// - [JsonProperty("assigned_by_roles")] - public List AssignedByRoles { get; set; } = new List(); + [JsonProperty(propertyName: "assigned_by_roles")] + public List AssignedByRoles { get; set; } + + /// + /// Determines whether to serialize the AssignedTo property. + /// + /// True if AssignedTo should be serialized, false otherwise. + public bool ShouldSerializeAssignedTo() + { + return AssignedTo != null && AssignedTo.Count > 0; + } + + /// + /// Determines whether to serialize the AssignedByRoles property. + /// + /// True if AssignedByRoles should be serialized, false otherwise. + public bool ShouldSerializeAssignedByRoles() + { + return AssignedByRoles != null && AssignedByRoles.Count > 0; + } } /// @@ -251,19 +314,19 @@ public class BulkWorkflowUser /// /// Gets or sets the user UID. /// - [JsonProperty("uid")] + [JsonProperty(propertyName: "uid")] public string Uid { get; set; } /// /// Gets or sets the user name. /// - [JsonProperty("name")] + [JsonProperty(propertyName: "name")] public string Name { get; set; } /// /// Gets or sets the user email. /// - [JsonProperty("email")] + [JsonProperty(propertyName: "email")] public string Email { get; set; } } @@ -275,13 +338,13 @@ public class BulkWorkflowRole /// /// Gets or sets the role UID. /// - [JsonProperty("uid")] + [JsonProperty(propertyName: "uid")] public string Uid { get; set; } /// /// Gets or sets the role name. /// - [JsonProperty("name")] + [JsonProperty(propertyName: "name")] public string Name { get; set; } } @@ -293,8 +356,17 @@ public class BulkAddItemsData /// /// Gets or sets the list of items to add/update. /// - [JsonProperty("items")] - public List Items { get; set; } = new List(); + [JsonProperty(propertyName: "items")] + public List Items { get; set; } + + /// + /// Determines whether to serialize the Items property. + /// + /// True if Items should be serialized, false otherwise. + public bool ShouldSerializeItems() + { + return Items != null && Items.Count > 0; + } } /// @@ -305,13 +377,13 @@ public class BulkAddItem /// /// Gets or sets the item UID. /// - [JsonProperty("uid")] + [JsonProperty(propertyName: "uid")] public string Uid { get; set; } /// /// Gets or sets the content type. /// - [JsonProperty("content_type")] + [JsonProperty(propertyName: "content_type")] public string ContentType { get; set; } } @@ -323,32 +395,50 @@ public class BulkReleaseItemsData /// /// Gets or sets the release UID. /// - [JsonProperty("release")] + [JsonProperty(propertyName: "release")] public string Release { get; set; } /// /// Gets or sets the action to perform (publish, unpublish, etc.). /// - [JsonProperty("action")] + [JsonProperty(propertyName: "action")] public string Action { get; set; } /// /// Gets or sets the list of locales. /// - [JsonProperty("locale")] - public List Locale { get; set; } = new List(); + [JsonProperty(propertyName: "locale")] + public List Locale { get; set; } /// /// Gets or sets the reference flag. /// - [JsonProperty("reference")] + [JsonProperty(propertyName: "reference")] public bool Reference { get; set; } /// /// Gets or sets the list of items to process. /// - [JsonProperty("items")] - public List Items { get; set; } = new List(); + [JsonProperty(propertyName: "items")] + public List Items { get; set; } + + /// + /// Determines whether to serialize the Locale property. + /// + /// True if Locale should be serialized, false otherwise. + public bool ShouldSerializeLocale() + { + return Locale != null && Locale.Count > 0; + } + + /// + /// Determines whether to serialize the Items property. + /// + /// True if Items should be serialized, false otherwise. + public bool ShouldSerializeItems() + { + return Items != null && Items.Count > 0; + } } /// @@ -359,31 +449,31 @@ public class BulkReleaseItem /// /// Gets or sets the content type UID. /// - [JsonProperty("content_type_uid")] + [JsonProperty(propertyName: "content_type_uid")] public string ContentTypeUid { get; set; } /// /// Gets or sets the item UID. /// - [JsonProperty("uid")] + [JsonProperty(propertyName: "uid")] public string Uid { get; set; } /// /// Gets or sets the version number. /// - [JsonProperty("version")] + [JsonProperty(propertyName: "version")] public int Version { get; set; } /// /// Gets or sets the locale. /// - [JsonProperty("locale")] + [JsonProperty(propertyName: "locale")] public string Locale { get; set; } /// /// Gets or sets the title. /// - [JsonProperty("title")] + [JsonProperty(propertyName: "title")] public string Title { get; set; } } } \ No newline at end of file From 817b3a70bd910b96e683122b0d5eb2377313682e Mon Sep 17 00:00:00 2001 From: raj pandey Date: Tue, 15 Jul 2025 12:06:52 +0530 Subject: [PATCH 3/3] Added Unit test case for bulk operation services --- .../Services/Stack/BulkAddItemsServiceTest.cs | 239 +++++++++++ .../Services/Stack/BulkDeleteServiceTest.cs | 248 +++++++++++ .../Stack/BulkJobStatusServiceTest.cs | 323 ++++++++++++++ .../Services/Stack/BulkPublishServiceTest.cs | 313 ++++++++++++++ .../Stack/BulkReleaseItemsServiceTest.cs | 406 ++++++++++++++++++ .../Stack/BulkUnpublishServiceTest.cs | 341 +++++++++++++++ .../Stack/BulkUpdateItemsServiceTest.cs | 322 ++++++++++++++ .../Stack/BulkWorkflowUpdateServiceTest.cs | 332 ++++++++++++++ .../BulkOperation/BulkOperationModelsTest.cs | 22 +- .../BulkOperation/BulkOperationsUnitTest.cs | 62 +-- .../Models/BulkReleaseItemsTest.cs | 6 +- .../Services/BulkOperationServicesTest.cs | 20 +- 12 files changed, 2591 insertions(+), 43 deletions(-) create mode 100644 Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkAddItemsServiceTest.cs create mode 100644 Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkDeleteServiceTest.cs create mode 100644 Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkJobStatusServiceTest.cs create mode 100644 Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkPublishServiceTest.cs create mode 100644 Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkReleaseItemsServiceTest.cs create mode 100644 Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkUnpublishServiceTest.cs create mode 100644 Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkUpdateItemsServiceTest.cs create mode 100644 Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkWorkflowUpdateServiceTest.cs diff --git a/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkAddItemsServiceTest.cs b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkAddItemsServiceTest.cs new file mode 100644 index 0000000..d0e230d --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkAddItemsServiceTest.cs @@ -0,0 +1,239 @@ +using System; +using System.Text; +using AutoFixture; +using AutoFixture.AutoMoq; +using Contentstack.Management.Core.Models; +using Contentstack.Management.Core.Services.Stack.BulkOperation; +using Contentstack.Management.Core.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Unit.Tests.Core.Services.Stack +{ + [TestClass] + public class BulkAddItemsServiceTest + { + private JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings()); + private readonly IFixture _fixture = new Fixture() + .Customize(new AutoMoqCustomization()); + + [TestMethod] + public void Should_Throw_On_Null_Serializer() + { + var data = new BulkAddItemsData(); + Assert.ThrowsException(() => new BulkAddItemsService( + null, + new Management.Core.Models.Stack(null), + data)); + } + + [TestMethod] + public void Should_Throw_On_Null_Data() + { + Assert.ThrowsException(() => new BulkAddItemsService( + serializer, + new Management.Core.Models.Stack(null), + null)); + } + + [TestMethod] + public void Should_Create_Service_With_Valid_Parameters() + { + var data = new BulkAddItemsData(); + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Set_Bulk_Version_Header_When_Provided() + { + var data = new BulkAddItemsData(); + var bulkVersion = "1.0"; + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data, bulkVersion); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual(bulkVersion, service.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Not_Set_Bulk_Version_Header_When_Not_Provided() + { + var data = new BulkAddItemsData(); + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service); + Assert.IsFalse(service.Headers.ContainsKey("bulk_version")); + } + + [TestMethod] + public void Should_Set_Bulk_Version_Header_With_Empty_String() + { + var data = new BulkAddItemsData(); + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data, ""); + + Assert.IsNotNull(service); + Assert.IsFalse(service.Headers.ContainsKey("bulk_version")); + } + + + + [TestMethod] + public void Should_Set_Bulk_Version_Header_With_Complex_Version() + { + var data = new BulkAddItemsData(); + var bulkVersion = "2.1.3-beta"; + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data, bulkVersion); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual(bulkVersion, service.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Create_Content_Body_From_Data() + { + var data = new BulkAddItemsData(); + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data); + service.ContentBody(); + + Assert.IsNotNull(service.ByteContent); + var content = Encoding.UTF8.GetString(service.ByteContent); + Assert.IsTrue(content.Contains("{}")); // Empty JSON object for empty data + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_API_Key() + { + var data = new BulkAddItemsData(); + var apiKey = "test-api-key"; + var stack = new Management.Core.Models.Stack(null, apiKey); + var service = new BulkAddItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Management_Token() + { + var data = new BulkAddItemsData(); + var managementToken = "test-management-token"; + var stack = new Management.Core.Models.Stack(null, null, managementToken); + var service = new BulkAddItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Branch_Uid() + { + var data = new BulkAddItemsData(); + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, null, null, branchUid); + var service = new BulkAddItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_All_Stack_Parameters() + { + var data = new BulkAddItemsData(); + var apiKey = "test-api-key"; + var managementToken = "test-management-token"; + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, apiKey, managementToken, branchUid); + var service = new BulkAddItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Handle_Multiple_Service_Instances() + { + var data1 = new BulkAddItemsData(); + var data2 = new BulkAddItemsData(); + var bulkVersion1 = "1.0"; + var bulkVersion2 = "2.0"; + + var service1 = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data1, bulkVersion1); + var service2 = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data2, bulkVersion2); + + Assert.IsNotNull(service1); + Assert.IsNotNull(service2); + Assert.AreEqual(bulkVersion1, service1.Headers["bulk_version"]); + Assert.AreEqual(bulkVersion2, service2.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Verify_Service_Inheritance() + { + var data = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), new BulkAddItemsData()); + + Assert.IsInstanceOfType(data, typeof(ContentstackService)); + } + + [TestMethod] + public void Should_Verify_Service_Type() + { + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), new BulkAddItemsData()); + + Assert.AreEqual(typeof(BulkAddItemsService), service.GetType()); + } + + [TestMethod] + public void Should_Handle_Content_Body_Called_Multiple_Times() + { + var data = new BulkAddItemsData(); + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data); + + service.ContentBody(); + var firstContent = Encoding.UTF8.GetString(service.ByteContent); + + service.ContentBody(); + var secondContent = Encoding.UTF8.GetString(service.ByteContent); + + Assert.AreEqual(firstContent, secondContent); + } + + [TestMethod] + public void Should_Verify_Headers_Collection_Is_Initialized() + { + var data = new BulkAddItemsData(); + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Not_Null() + { + var data = new BulkAddItemsData(); + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service.ResourcePath); + Assert.IsFalse(string.IsNullOrEmpty(service.ResourcePath)); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Not_Null() + { + var data = new BulkAddItemsData(); + var service = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service.HttpMethod); + Assert.IsFalse(string.IsNullOrEmpty(service.HttpMethod)); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkDeleteServiceTest.cs b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkDeleteServiceTest.cs new file mode 100644 index 0000000..11f05c1 --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkDeleteServiceTest.cs @@ -0,0 +1,248 @@ +using System; +using System.Text; +using AutoFixture; +using AutoFixture.AutoMoq; +using Contentstack.Management.Core.Models; +using Contentstack.Management.Core.Services.Stack.BulkOperation; +using Contentstack.Management.Core.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Unit.Tests.Core.Services.Stack +{ + [TestClass] + public class BulkDeleteServiceTest + { + private JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings()); + private readonly IFixture _fixture = new Fixture() + .Customize(new AutoMoqCustomization()); + + [TestMethod] + public void Should_Throw_On_Null_Serializer() + { + var details = new BulkDeleteDetails(); + Assert.ThrowsException(() => new BulkDeleteService( + null, + new Management.Core.Models.Stack(null), + details)); + } + + [TestMethod] + public void Should_Throw_On_Null_Details() + { + Assert.ThrowsException(() => new BulkDeleteService( + serializer, + new Management.Core.Models.Stack(null), + null)); + } + + [TestMethod] + public void Should_Create_Service_With_Valid_Parameters() + { + var details = new BulkDeleteDetails(); + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/delete", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Content_Body_From_Details() + { + var details = new BulkDeleteDetails(); + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details); + service.ContentBody(); + + Assert.IsNotNull(service.ByteContent); + var content = Encoding.UTF8.GetString(service.ByteContent); + Assert.IsTrue(content.Contains("{}")); // Empty JSON object for empty details + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_API_Key() + { + var details = new BulkDeleteDetails(); + var apiKey = "test-api-key"; + var stack = new Management.Core.Models.Stack(null, apiKey); + var service = new BulkDeleteService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/delete", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Management_Token() + { + var details = new BulkDeleteDetails(); + var managementToken = "test-management-token"; + var stack = new Management.Core.Models.Stack(null, null, managementToken); + var service = new BulkDeleteService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/delete", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Branch_Uid() + { + var details = new BulkDeleteDetails(); + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, null, null, branchUid); + var service = new BulkDeleteService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/delete", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_All_Stack_Parameters() + { + var details = new BulkDeleteDetails(); + var apiKey = "test-api-key"; + var managementToken = "test-management-token"; + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, apiKey, managementToken, branchUid); + var service = new BulkDeleteService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/delete", service.ResourcePath); + } + + [TestMethod] + public void Should_Handle_Multiple_Service_Instances() + { + var details1 = new BulkDeleteDetails(); + var details2 = new BulkDeleteDetails(); + + var service1 = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details1); + var service2 = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details2); + + Assert.IsNotNull(service1); + Assert.IsNotNull(service2); + Assert.AreEqual("/bulk/delete", service1.ResourcePath); + Assert.AreEqual("/bulk/delete", service2.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Inheritance() + { + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), new BulkDeleteDetails()); + + Assert.IsInstanceOfType(service, typeof(ContentstackService)); + } + + [TestMethod] + public void Should_Verify_Service_Type() + { + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), new BulkDeleteDetails()); + + Assert.AreEqual(typeof(BulkDeleteService), service.GetType()); + } + + [TestMethod] + public void Should_Handle_Content_Body_Called_Multiple_Times() + { + var details = new BulkDeleteDetails(); + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details); + + service.ContentBody(); + var firstContent = Encoding.UTF8.GetString(service.ByteContent); + + service.ContentBody(); + var secondContent = Encoding.UTF8.GetString(service.ByteContent); + + Assert.AreEqual(firstContent, secondContent); + } + + [TestMethod] + public void Should_Verify_Headers_Collection_Is_Initialized() + { + var details = new BulkDeleteDetails(); + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Not_Null() + { + var details = new BulkDeleteDetails(); + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service.ResourcePath); + Assert.IsFalse(string.IsNullOrEmpty(service.ResourcePath)); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Not_Null() + { + var details = new BulkDeleteDetails(); + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service.HttpMethod); + Assert.IsFalse(string.IsNullOrEmpty(service.HttpMethod)); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Correct() + { + var details = new BulkDeleteDetails(); + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.AreEqual("/bulk/delete", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Post() + { + var details = new BulkDeleteDetails(); + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.AreEqual("POST", service.HttpMethod); + } + + [TestMethod] + public void Should_Handle_Null_Details_Content_Body() + { + var details = new BulkDeleteDetails(); + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details); + + // This should not throw an exception + service.ContentBody(); + Assert.IsNotNull(service.ByteContent); + } + + [TestMethod] + public void Should_Verify_Service_Properties_Are_Set() + { + var details = new BulkDeleteDetails(); + var service = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/delete", service.ResourcePath); + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Service_Can_Be_Instantiated_With_Different_Serializers() + { + var details = new BulkDeleteDetails(); + var customSerializer = JsonSerializer.Create(new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }); + + var service = new BulkDeleteService(customSerializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/delete", service.ResourcePath); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkJobStatusServiceTest.cs b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkJobStatusServiceTest.cs new file mode 100644 index 0000000..2bb416b --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkJobStatusServiceTest.cs @@ -0,0 +1,323 @@ +using System; +using AutoFixture; +using AutoFixture.AutoMoq; +using Contentstack.Management.Core.Models; +using Contentstack.Management.Core.Services.Stack.BulkOperation; +using Contentstack.Management.Core.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Unit.Tests.Core.Services.Stack +{ + [TestClass] + public class BulkJobStatusServiceTest + { + private JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings()); + private readonly IFixture _fixture = new Fixture() + .Customize(new AutoMoqCustomization()); + + [TestMethod] + public void Should_Throw_On_Null_Serializer() + { + var jobId = "test-job-id"; + Assert.ThrowsException(() => new BulkJobStatusService( + null, + new Management.Core.Models.Stack(null), + jobId)); + } + + [TestMethod] + public void Should_Throw_On_Null_JobId() + { + Assert.ThrowsException(() => new BulkJobStatusService( + serializer, + new Management.Core.Models.Stack(null), + null)); + } + + + + [TestMethod] + public void Should_Create_Service_With_Valid_Parameters() + { + var jobId = "test-job-id"; + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId); + + Assert.IsNotNull(service); + Assert.AreEqual("GET", service.HttpMethod); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + } + + [TestMethod] + public void Should_Set_Bulk_Version_Header_When_Provided() + { + var jobId = "test-job-id"; + var bulkVersion = "1.0"; + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId, bulkVersion); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual(bulkVersion, service.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Not_Set_Bulk_Version_Header_When_Not_Provided() + { + var jobId = "test-job-id"; + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId); + + Assert.IsNotNull(service); + Assert.IsFalse(service.Headers.ContainsKey("bulk_version")); + } + + [TestMethod] + public void Should_Not_Set_Bulk_Version_Header_With_Empty_String() + { + var jobId = "test-job-id"; + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId, ""); + + Assert.IsNotNull(service); + Assert.IsFalse(service.Headers.ContainsKey("bulk_version")); + } + + + + [TestMethod] + public void Should_Set_Bulk_Version_Header_With_Complex_Version() + { + var jobId = "test-job-id"; + var bulkVersion = "2.1.3-beta"; + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId, bulkVersion); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual(bulkVersion, service.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_API_Key() + { + var jobId = "test-job-id"; + var apiKey = "test-api-key"; + var stack = new Management.Core.Models.Stack(null, apiKey); + var service = new BulkJobStatusService(serializer, stack, jobId); + + Assert.IsNotNull(service); + Assert.AreEqual("GET", service.HttpMethod); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Management_Token() + { + var jobId = "test-job-id"; + var managementToken = "test-management-token"; + var stack = new Management.Core.Models.Stack(null, null, managementToken); + var service = new BulkJobStatusService(serializer, stack, jobId); + + Assert.IsNotNull(service); + Assert.AreEqual("GET", service.HttpMethod); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Branch_Uid() + { + var jobId = "test-job-id"; + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, null, null, branchUid); + var service = new BulkJobStatusService(serializer, stack, jobId); + + Assert.IsNotNull(service); + Assert.AreEqual("GET", service.HttpMethod); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_All_Stack_Parameters() + { + var jobId = "test-job-id"; + var apiKey = "test-api-key"; + var managementToken = "test-management-token"; + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, apiKey, managementToken, branchUid); + var service = new BulkJobStatusService(serializer, stack, jobId); + + Assert.IsNotNull(service); + Assert.AreEqual("GET", service.HttpMethod); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + } + + [TestMethod] + public void Should_Handle_Multiple_Service_Instances() + { + var jobId1 = "job-1"; + var jobId2 = "job-2"; + var bulkVersion1 = "1.0"; + var bulkVersion2 = "2.0"; + + var service1 = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId1, bulkVersion1); + var service2 = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId2, bulkVersion2); + + Assert.IsNotNull(service1); + Assert.IsNotNull(service2); + Assert.AreEqual($"/bulk/jobs/{jobId1}", service1.ResourcePath); + Assert.AreEqual($"/bulk/jobs/{jobId2}", service2.ResourcePath); + Assert.AreEqual(bulkVersion1, service1.Headers["bulk_version"]); + Assert.AreEqual(bulkVersion2, service2.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Verify_Service_Inheritance() + { + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), "test-job-id"); + + Assert.IsInstanceOfType(service, typeof(ContentstackService)); + } + + [TestMethod] + public void Should_Verify_Service_Type() + { + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), "test-job-id"); + + Assert.AreEqual(typeof(BulkJobStatusService), service.GetType()); + } + + [TestMethod] + public void Should_Verify_Headers_Collection_Is_Initialized() + { + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), "test-job-id"); + + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Not_Null() + { + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), "test-job-id"); + + Assert.IsNotNull(service.ResourcePath); + Assert.IsFalse(string.IsNullOrEmpty(service.ResourcePath)); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Not_Null() + { + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), "test-job-id"); + + Assert.IsNotNull(service.HttpMethod); + Assert.IsFalse(string.IsNullOrEmpty(service.HttpMethod)); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Correct() + { + var jobId = "test-job-id"; + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId); + + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Get() + { + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), "test-job-id"); + + Assert.AreEqual("GET", service.HttpMethod); + } + + [TestMethod] + public void Should_Verify_Service_Properties_Are_Set() + { + var jobId = "test-job-id"; + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId); + + Assert.IsNotNull(service); + Assert.AreEqual("GET", service.HttpMethod); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Service_Can_Be_Instantiated_With_Different_Serializers() + { + var jobId = "test-job-id"; + var customSerializer = JsonSerializer.Create(new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }); + + var service = new BulkJobStatusService(customSerializer, new Management.Core.Models.Stack(null), jobId); + + Assert.IsNotNull(service); + Assert.AreEqual("GET", service.HttpMethod); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Different_Job_Ids_Are_Handled_Correctly() + { + var jobIds = new[] { "job-1", "job-2", "job-3", "bulk-job-123", "test-job-id" }; + + foreach (var jobId in jobIds) + { + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + } + } + + [TestMethod] + public void Should_Verify_Different_Bulk_Versions_Are_Handled_Correctly() + { + var jobId = "test-job-id"; + var versions = new[] { "1.0", "2.0", "3.0", "latest", "stable" }; + + foreach (var version in versions) + { + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId, version); + Assert.AreEqual(version, service.Headers["bulk_version"]); + } + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Other_Services() + { + var jobId = "test-job-id"; + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId); + + Assert.AreEqual("GET", service.HttpMethod); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + Assert.IsTrue(service.ResourcePath.Contains("/bulk/jobs/")); + } + + [TestMethod] + public void Should_Handle_Special_Characters_In_JobId() + { + var jobIds = new[] { "job-123", "job_456", "job.789", "job@test", "job#test" }; + + foreach (var jobId in jobIds) + { + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), jobId); + Assert.AreEqual($"/bulk/jobs/{jobId}", service.ResourcePath); + } + } + + [TestMethod] + public void Should_Handle_Long_JobId() + { + var longJobId = new string('a', 1000); + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), longJobId); + + Assert.AreEqual($"/bulk/jobs/{longJobId}", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Has_No_Content_Body_Method() + { + var service = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), "test-job-id"); + + // GET requests typically don't have content body + Assert.IsNull(service.ByteContent); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkPublishServiceTest.cs b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkPublishServiceTest.cs new file mode 100644 index 0000000..19d2073 --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkPublishServiceTest.cs @@ -0,0 +1,313 @@ +using System; +using System.Text; +using AutoFixture; +using AutoFixture.AutoMoq; +using Contentstack.Management.Core.Models; +using Contentstack.Management.Core.Services.Stack.BulkOperation; +using Contentstack.Management.Core.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Unit.Tests.Core.Services.Stack +{ + [TestClass] + public class BulkPublishServiceTest + { + private JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings()); + private readonly IFixture _fixture = new Fixture() + .Customize(new AutoMoqCustomization()); + + [TestMethod] + public void Should_Throw_On_Null_Serializer() + { + var details = new BulkPublishDetails(); + Assert.ThrowsException(() => new BulkPublishService( + null, + new Management.Core.Models.Stack(null), + details)); + } + + [TestMethod] + public void Should_Throw_On_Null_Details() + { + Assert.ThrowsException(() => new BulkPublishService( + serializer, + new Management.Core.Models.Stack(null), + null)); + } + + [TestMethod] + public void Should_Create_Service_With_Valid_Parameters() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/publish", service.ResourcePath); + } + + [TestMethod] + public void Should_Set_Skip_Workflow_Stage_Header_When_True() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details, skipWorkflowStage: true); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("skip_workflow_stage_check")); + Assert.AreEqual("true", service.Headers["skip_workflow_stage_check"]); + } + + [TestMethod] + public void Should_Set_Approvals_Header_When_True() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details, approvals: true); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("approvals")); + Assert.AreEqual("true", service.Headers["approvals"]); + } + + [TestMethod] + public void Should_Set_Nested_Query_Parameters_When_True() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details, isNested: true); + + Assert.IsNotNull(service); + // Note: Query parameters are typically handled internally, so we just verify the service is created + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/publish", service.ResourcePath); + } + + + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_API_Key() + { + var details = new BulkPublishDetails(); + var apiKey = "test-api-key"; + var stack = new Management.Core.Models.Stack(null, apiKey); + var service = new BulkPublishService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/publish", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Management_Token() + { + var details = new BulkPublishDetails(); + var managementToken = "test-management-token"; + var stack = new Management.Core.Models.Stack(null, null, managementToken); + var service = new BulkPublishService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/publish", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Branch_Uid() + { + var details = new BulkPublishDetails(); + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, null, null, branchUid); + var service = new BulkPublishService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/publish", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_All_Stack_Parameters() + { + var details = new BulkPublishDetails(); + var apiKey = "test-api-key"; + var managementToken = "test-management-token"; + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, apiKey, managementToken, branchUid); + var service = new BulkPublishService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/publish", service.ResourcePath); + } + + [TestMethod] + public void Should_Handle_Multiple_Service_Instances() + { + var details1 = new BulkPublishDetails(); + var details2 = new BulkPublishDetails(); + + var service1 = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details1); + var service2 = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details2); + + Assert.IsNotNull(service1); + Assert.IsNotNull(service2); + Assert.AreEqual("/bulk/publish", service1.ResourcePath); + Assert.AreEqual("/bulk/publish", service2.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Inheritance() + { + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), new BulkPublishDetails()); + + Assert.IsInstanceOfType(service, typeof(ContentstackService)); + } + + [TestMethod] + public void Should_Verify_Service_Type() + { + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), new BulkPublishDetails()); + + Assert.AreEqual(typeof(BulkPublishService), service.GetType()); + } + + [TestMethod] + public void Should_Handle_Content_Body_Called_Multiple_Times() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + + service.ContentBody(); + var firstContent = Encoding.UTF8.GetString(service.ByteContent); + + service.ContentBody(); + var secondContent = Encoding.UTF8.GetString(service.ByteContent); + + Assert.AreEqual(firstContent, secondContent); + } + + [TestMethod] + public void Should_Verify_Headers_Collection_Is_Initialized() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Not_Null() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service.ResourcePath); + Assert.IsFalse(string.IsNullOrEmpty(service.ResourcePath)); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Not_Null() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service.HttpMethod); + Assert.IsFalse(string.IsNullOrEmpty(service.HttpMethod)); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Correct() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.AreEqual("/bulk/publish", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Post() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.AreEqual("POST", service.HttpMethod); + } + + [TestMethod] + public void Should_Handle_Null_Details_Content_Body() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + + // This should not throw an exception + service.ContentBody(); + Assert.IsNotNull(service.ByteContent); + } + + [TestMethod] + public void Should_Verify_Service_Properties_Are_Set() + { + var details = new BulkPublishDetails(); + var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/publish", service.ResourcePath); + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Service_Can_Be_Instantiated_With_Different_Serializers() + { + var details = new BulkPublishDetails(); + var customSerializer = JsonSerializer.Create(new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }); + + var service = new BulkPublishService(customSerializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/publish", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Unpublish_Service() + { + var details = new BulkPublishDetails(); + var publishService = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + var unpublishService = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.AreEqual("POST", publishService.HttpMethod); + Assert.AreEqual("POST", unpublishService.HttpMethod); + Assert.AreEqual("/bulk/publish", publishService.ResourcePath); + Assert.AreEqual("/bulk/unpublish", unpublishService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Delete_Service() + { + var details = new BulkPublishDetails(); + var publishService = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + var deleteDetails = new BulkDeleteDetails(); + var deleteService = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), deleteDetails); + + Assert.AreEqual("POST", publishService.HttpMethod); + Assert.AreEqual("POST", deleteService.HttpMethod); + Assert.AreEqual("/bulk/publish", publishService.ResourcePath); + Assert.AreEqual("/bulk/delete", deleteService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Workflow_Update_Service() + { + var details = new BulkPublishDetails(); + var publishService = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + var workflowDetails = new BulkWorkflowUpdateBody(); + var workflowService = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), workflowDetails); + + Assert.AreEqual("POST", publishService.HttpMethod); + Assert.AreEqual("POST", workflowService.HttpMethod); + Assert.AreEqual("/bulk/publish", publishService.ResourcePath); + Assert.AreEqual("/bulk/workflow", workflowService.ResourcePath); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkReleaseItemsServiceTest.cs b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkReleaseItemsServiceTest.cs new file mode 100644 index 0000000..22dc90b --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkReleaseItemsServiceTest.cs @@ -0,0 +1,406 @@ +using System; +using System.Text; +using AutoFixture; +using AutoFixture.AutoMoq; +using Contentstack.Management.Core.Models; +using Contentstack.Management.Core.Services.Stack.BulkOperation; +using Contentstack.Management.Core.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Unit.Tests.Core.Services.Stack +{ + [TestClass] + public class BulkReleaseItemsServiceTest + { + private JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings()); + private readonly IFixture _fixture = new Fixture() + .Customize(new AutoMoqCustomization()); + + [TestMethod] + public void Should_Throw_On_Null_Serializer() + { + var data = new BulkReleaseItemsData(); + Assert.ThrowsException(() => new BulkReleaseItemsService( + null, + new Management.Core.Models.Stack(null), + data)); + } + + [TestMethod] + public void Should_Throw_On_Null_Data() + { + Assert.ThrowsException(() => new BulkReleaseItemsService( + serializer, + new Management.Core.Models.Stack(null), + null)); + } + + [TestMethod] + public void Should_Create_Service_With_Valid_Parameters() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Set_Bulk_Version_Header_When_Provided() + { + var data = new BulkReleaseItemsData(); + var bulkVersion = "1.0"; + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data, bulkVersion); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual(bulkVersion, service.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Not_Set_Bulk_Version_Header_When_Not_Provided() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service); + Assert.IsFalse(service.Headers.ContainsKey("bulk_version")); + } + + [TestMethod] + public void Should_Set_Bulk_Version_Header_With_Empty_String() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data, ""); + + Assert.IsNotNull(service); + Assert.IsFalse(service.Headers.ContainsKey("bulk_version")); + } + + + + [TestMethod] + public void Should_Set_Bulk_Version_Header_With_Complex_Version() + { + var data = new BulkReleaseItemsData(); + var bulkVersion = "2.1.3-beta"; + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data, bulkVersion); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual(bulkVersion, service.Headers["bulk_version"]); + } + + + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_API_Key() + { + var data = new BulkReleaseItemsData(); + var apiKey = "test-api-key"; + var stack = new Management.Core.Models.Stack(null, apiKey); + var service = new BulkReleaseItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Management_Token() + { + var data = new BulkReleaseItemsData(); + var managementToken = "test-management-token"; + var stack = new Management.Core.Models.Stack(null, null, managementToken); + var service = new BulkReleaseItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Branch_Uid() + { + var data = new BulkReleaseItemsData(); + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, null, null, branchUid); + var service = new BulkReleaseItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_All_Stack_Parameters() + { + var data = new BulkReleaseItemsData(); + var apiKey = "test-api-key"; + var managementToken = "test-management-token"; + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, apiKey, managementToken, branchUid); + var service = new BulkReleaseItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Handle_Multiple_Service_Instances() + { + var data1 = new BulkReleaseItemsData(); + var data2 = new BulkReleaseItemsData(); + var bulkVersion1 = "1.0"; + var bulkVersion2 = "2.0"; + + var service1 = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data1, bulkVersion1); + var service2 = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data2, bulkVersion2); + + Assert.IsNotNull(service1); + Assert.IsNotNull(service2); + Assert.AreEqual(bulkVersion1, service1.Headers["bulk_version"]); + Assert.AreEqual(bulkVersion2, service2.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Verify_Service_Inheritance() + { + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), new BulkReleaseItemsData()); + + Assert.IsInstanceOfType(service, typeof(ContentstackService)); + } + + [TestMethod] + public void Should_Verify_Service_Type() + { + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), new BulkReleaseItemsData()); + + Assert.AreEqual(typeof(BulkReleaseItemsService), service.GetType()); + } + + [TestMethod] + public void Should_Handle_Content_Body_Called_Multiple_Times() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + service.ContentBody(); + var firstContent = Encoding.UTF8.GetString(service.ByteContent); + + service.ContentBody(); + var secondContent = Encoding.UTF8.GetString(service.ByteContent); + + Assert.AreEqual(firstContent, secondContent); + } + + [TestMethod] + public void Should_Verify_Headers_Collection_Is_Initialized() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Not_Null() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service.ResourcePath); + Assert.IsFalse(string.IsNullOrEmpty(service.ResourcePath)); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Not_Null() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service.HttpMethod); + Assert.IsFalse(string.IsNullOrEmpty(service.HttpMethod)); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Correct() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Post() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.AreEqual("POST", service.HttpMethod); + } + + [TestMethod] + public void Should_Handle_Null_Data_Content_Body() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + // This should not throw an exception + service.ContentBody(); + Assert.IsNotNull(service.ByteContent); + } + + [TestMethod] + public void Should_Verify_Service_Properties_Are_Set() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Service_Can_Be_Instantiated_With_Different_Serializers() + { + var data = new BulkReleaseItemsData(); + var customSerializer = JsonSerializer.Create(new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }); + + var service = new BulkReleaseItemsService(customSerializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Different_Bulk_Versions_Are_Handled_Correctly() + { + var data = new BulkReleaseItemsData(); + var versions = new[] { "1.0", "2.0", "3.0", "latest", "stable" }; + + foreach (var version in versions) + { + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data, version); + Assert.AreEqual(version, service.Headers["bulk_version"]); + } + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Add_Items_Service() + { + var data = new BulkReleaseItemsData(); + var releaseService = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + var addData = new BulkAddItemsData(); + var addService = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), addData); + + Assert.AreEqual("POST", releaseService.HttpMethod); + Assert.AreEqual("POST", addService.HttpMethod); + Assert.AreEqual("/bulk/release/items", releaseService.ResourcePath); + Assert.AreEqual("/bulk/release/items", addService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Update_Items_Service() + { + var data = new BulkReleaseItemsData(); + var releaseService = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + var updateData = new BulkAddItemsData(); + var updateService = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), updateData); + + Assert.AreEqual("POST", releaseService.HttpMethod); + Assert.AreEqual("PUT", updateService.HttpMethod); + Assert.AreEqual("/bulk/release/items", releaseService.ResourcePath); + Assert.AreEqual("/bulk/release/update_items", updateService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Publish_Service() + { + var data = new BulkReleaseItemsData(); + var releaseService = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + var publishDetails = new BulkPublishDetails(); + var publishService = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), publishDetails); + + Assert.AreEqual("POST", releaseService.HttpMethod); + Assert.AreEqual("POST", publishService.HttpMethod); + Assert.AreEqual("/bulk/release/items", releaseService.ResourcePath); + Assert.AreEqual("/bulk/publish", publishService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Unpublish_Service() + { + var data = new BulkReleaseItemsData(); + var releaseService = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + var unpublishDetails = new BulkPublishDetails(); + var unpublishService = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), unpublishDetails); + + Assert.AreEqual("POST", releaseService.HttpMethod); + Assert.AreEqual("POST", unpublishService.HttpMethod); + Assert.AreEqual("/bulk/release/items", releaseService.ResourcePath); + Assert.AreEqual("/bulk/unpublish", unpublishService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Delete_Service() + { + var data = new BulkReleaseItemsData(); + var releaseService = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + var deleteDetails = new BulkDeleteDetails(); + var deleteService = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), deleteDetails); + + Assert.AreEqual("POST", releaseService.HttpMethod); + Assert.AreEqual("POST", deleteService.HttpMethod); + Assert.AreEqual("/bulk/release/items", releaseService.ResourcePath); + Assert.AreEqual("/bulk/delete", deleteService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Workflow_Update_Service() + { + var data = new BulkReleaseItemsData(); + var releaseService = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + var workflowDetails = new BulkWorkflowUpdateBody(); + var workflowService = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), workflowDetails); + + Assert.AreEqual("POST", releaseService.HttpMethod); + Assert.AreEqual("POST", workflowService.HttpMethod); + Assert.AreEqual("/bulk/release/items", releaseService.ResourcePath); + Assert.AreEqual("/bulk/workflow", workflowService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Release_Specific_Resource_Path() + { + var data = new BulkReleaseItemsData(); + var service = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsTrue(service.ResourcePath.Contains("release")); + Assert.AreEqual("/bulk/release/items", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Job_Status_Service() + { + var data = new BulkReleaseItemsData(); + var releaseService = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), data); + var jobService = new BulkJobStatusService(serializer, new Management.Core.Models.Stack(null), "test-job-id"); + + Assert.AreEqual("POST", releaseService.HttpMethod); + Assert.AreEqual("GET", jobService.HttpMethod); + Assert.AreEqual("/bulk/release/items", releaseService.ResourcePath); + Assert.AreEqual("/bulk/jobs/test-job-id", jobService.ResourcePath); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkUnpublishServiceTest.cs b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkUnpublishServiceTest.cs new file mode 100644 index 0000000..d6e0a65 --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkUnpublishServiceTest.cs @@ -0,0 +1,341 @@ +using System; +using System.Text; +using AutoFixture; +using AutoFixture.AutoMoq; +using Contentstack.Management.Core.Models; +using Contentstack.Management.Core.Services.Stack.BulkOperation; +using Contentstack.Management.Core.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Unit.Tests.Core.Services.Stack +{ + [TestClass] + public class BulkUnpublishServiceTest + { + private JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings()); + private readonly IFixture _fixture = new Fixture() + .Customize(new AutoMoqCustomization()); + + [TestMethod] + public void Should_Throw_On_Null_Serializer() + { + var details = new BulkPublishDetails(); + Assert.ThrowsException(() => new BulkUnpublishService( + null, + new Management.Core.Models.Stack(null), + details)); + } + + [TestMethod] + public void Should_Throw_On_Null_Details() + { + Assert.ThrowsException(() => new BulkUnpublishService( + serializer, + new Management.Core.Models.Stack(null), + null)); + } + + [TestMethod] + public void Should_Create_Service_With_Valid_Parameters() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/unpublish", service.ResourcePath); + } + + [TestMethod] + public void Should_Set_Skip_Workflow_Stage_Header_When_True() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details, skipWorkflowStage: true); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("skip_workflow_stage_check")); + Assert.AreEqual("true", service.Headers["skip_workflow_stage_check"]); + } + + [TestMethod] + public void Should_Set_Approvals_Header_When_True() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details, approvals: true); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("approvals")); + Assert.AreEqual("true", service.Headers["approvals"]); + } + + [TestMethod] + public void Should_Set_Nested_Query_Parameters_When_True() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details, isNested: true); + + Assert.IsNotNull(service); + // Note: Query parameters are typically handled internally, so we just verify the service is created + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/unpublish", service.ResourcePath); + } + + + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_API_Key() + { + var details = new BulkPublishDetails(); + var apiKey = "test-api-key"; + var stack = new Management.Core.Models.Stack(null, apiKey); + var service = new BulkUnpublishService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/unpublish", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Management_Token() + { + var details = new BulkPublishDetails(); + var managementToken = "test-management-token"; + var stack = new Management.Core.Models.Stack(null, null, managementToken); + var service = new BulkUnpublishService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/unpublish", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Branch_Uid() + { + var details = new BulkPublishDetails(); + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, null, null, branchUid); + var service = new BulkUnpublishService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/unpublish", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_All_Stack_Parameters() + { + var details = new BulkPublishDetails(); + var apiKey = "test-api-key"; + var managementToken = "test-management-token"; + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, apiKey, managementToken, branchUid); + var service = new BulkUnpublishService(serializer, stack, details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/unpublish", service.ResourcePath); + } + + [TestMethod] + public void Should_Handle_Multiple_Service_Instances() + { + var details1 = new BulkPublishDetails(); + var details2 = new BulkPublishDetails(); + + var service1 = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details1); + var service2 = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details2); + + Assert.IsNotNull(service1); + Assert.IsNotNull(service2); + Assert.AreEqual("/bulk/unpublish", service1.ResourcePath); + Assert.AreEqual("/bulk/unpublish", service2.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Inheritance() + { + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), new BulkPublishDetails()); + + Assert.IsInstanceOfType(service, typeof(ContentstackService)); + } + + [TestMethod] + public void Should_Verify_Service_Type() + { + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), new BulkPublishDetails()); + + Assert.AreEqual(typeof(BulkUnpublishService), service.GetType()); + } + + [TestMethod] + public void Should_Handle_Content_Body_Called_Multiple_Times() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + + service.ContentBody(); + var firstContent = Encoding.UTF8.GetString(service.ByteContent); + + service.ContentBody(); + var secondContent = Encoding.UTF8.GetString(service.ByteContent); + + Assert.AreEqual(firstContent, secondContent); + } + + [TestMethod] + public void Should_Verify_Headers_Collection_Is_Initialized() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Not_Null() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service.ResourcePath); + Assert.IsFalse(string.IsNullOrEmpty(service.ResourcePath)); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Not_Null() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service.HttpMethod); + Assert.IsFalse(string.IsNullOrEmpty(service.HttpMethod)); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Correct() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.AreEqual("/bulk/unpublish", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Post() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.AreEqual("POST", service.HttpMethod); + } + + [TestMethod] + public void Should_Handle_Null_Details_Content_Body() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + + // This should not throw an exception + service.ContentBody(); + Assert.IsNotNull(service.ByteContent); + } + + [TestMethod] + public void Should_Verify_Service_Properties_Are_Set() + { + var details = new BulkPublishDetails(); + var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/unpublish", service.ResourcePath); + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Service_Can_Be_Instantiated_With_Different_Serializers() + { + var details = new BulkPublishDetails(); + var customSerializer = JsonSerializer.Create(new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }); + + var service = new BulkUnpublishService(customSerializer, new Management.Core.Models.Stack(null), details); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/unpublish", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Publish_Service() + { + var details = new BulkPublishDetails(); + var unpublishService = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + var publishService = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details); + + Assert.AreEqual("POST", unpublishService.HttpMethod); + Assert.AreEqual("POST", publishService.HttpMethod); + Assert.AreEqual("/bulk/unpublish", unpublishService.ResourcePath); + Assert.AreEqual("/bulk/publish", publishService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Delete_Service() + { + var details = new BulkPublishDetails(); + var unpublishService = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + var deleteDetails = new BulkDeleteDetails(); + var deleteService = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), deleteDetails); + + Assert.AreEqual("POST", unpublishService.HttpMethod); + Assert.AreEqual("POST", deleteService.HttpMethod); + Assert.AreEqual("/bulk/unpublish", unpublishService.ResourcePath); + Assert.AreEqual("/bulk/delete", deleteService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Workflow_Update_Service() + { + var details = new BulkPublishDetails(); + var unpublishService = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + var workflowDetails = new BulkWorkflowUpdateBody(); + var workflowService = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), workflowDetails); + + Assert.AreEqual("POST", unpublishService.HttpMethod); + Assert.AreEqual("POST", workflowService.HttpMethod); + Assert.AreEqual("/bulk/unpublish", unpublishService.ResourcePath); + Assert.AreEqual("/bulk/workflow", workflowService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Add_Items_Service() + { + var details = new BulkPublishDetails(); + var unpublishService = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + var addData = new BulkAddItemsData(); + var addService = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), addData); + + Assert.AreEqual("POST", unpublishService.HttpMethod); + Assert.AreEqual("POST", addService.HttpMethod); + Assert.AreEqual("/bulk/unpublish", unpublishService.ResourcePath); + Assert.AreEqual("/bulk/release/items", addService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Update_Items_Service() + { + var details = new BulkPublishDetails(); + var unpublishService = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details); + var updateData = new BulkAddItemsData(); + var updateService = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), updateData); + + Assert.AreEqual("POST", unpublishService.HttpMethod); + Assert.AreEqual("PUT", updateService.HttpMethod); + Assert.AreEqual("/bulk/unpublish", unpublishService.ResourcePath); + Assert.AreEqual("/bulk/release/update_items", updateService.ResourcePath); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkUpdateItemsServiceTest.cs b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkUpdateItemsServiceTest.cs new file mode 100644 index 0000000..fc28d12 --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkUpdateItemsServiceTest.cs @@ -0,0 +1,322 @@ +using System; +using System.Text; +using AutoFixture; +using AutoFixture.AutoMoq; +using Contentstack.Management.Core.Models; +using Contentstack.Management.Core.Services.Stack.BulkOperation; +using Contentstack.Management.Core.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Unit.Tests.Core.Services.Stack +{ + [TestClass] + public class BulkUpdateItemsServiceTest + { + private JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings()); + private readonly IFixture _fixture = new Fixture() + .Customize(new AutoMoqCustomization()); + + [TestMethod] + public void Should_Throw_On_Null_Serializer() + { + var data = new BulkAddItemsData(); + Assert.ThrowsException(() => new BulkUpdateItemsService( + null, + new Management.Core.Models.Stack(null), + data)); + } + + [TestMethod] + public void Should_Throw_On_Null_Data() + { + Assert.ThrowsException(() => new BulkUpdateItemsService( + serializer, + new Management.Core.Models.Stack(null), + null)); + } + + [TestMethod] + public void Should_Create_Service_With_Valid_Parameters() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service); + Assert.AreEqual("PUT", service.HttpMethod); + Assert.AreEqual("/bulk/release/update_items", service.ResourcePath); + } + + [TestMethod] + public void Should_Set_Bulk_Version_Header_When_Provided() + { + var data = new BulkAddItemsData(); + var bulkVersion = "1.0"; + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data, bulkVersion); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual(bulkVersion, service.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Not_Set_Bulk_Version_Header_When_Not_Provided() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service); + Assert.IsFalse(service.Headers.ContainsKey("bulk_version")); + } + + [TestMethod] + public void Should_Set_Bulk_Version_Header_With_Empty_String() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data, ""); + + Assert.IsNotNull(service); + Assert.IsFalse(service.Headers.ContainsKey("bulk_version")); + } + + + + [TestMethod] + public void Should_Set_Bulk_Version_Header_With_Complex_Version() + { + var data = new BulkAddItemsData(); + var bulkVersion = "2.1.3-beta"; + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data, bulkVersion); + + Assert.IsNotNull(service); + Assert.IsTrue(service.Headers.ContainsKey("bulk_version")); + Assert.AreEqual(bulkVersion, service.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Create_Content_Body_From_Data() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + service.ContentBody(); + + Assert.IsNotNull(service.ByteContent); + var content = Encoding.UTF8.GetString(service.ByteContent); + Assert.IsTrue(content.Contains("{}")); // Empty JSON object for empty data + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_API_Key() + { + var data = new BulkAddItemsData(); + var apiKey = "test-api-key"; + var stack = new Management.Core.Models.Stack(null, apiKey); + var service = new BulkUpdateItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("PUT", service.HttpMethod); + Assert.AreEqual("/bulk/release/update_items", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Management_Token() + { + var data = new BulkAddItemsData(); + var managementToken = "test-management-token"; + var stack = new Management.Core.Models.Stack(null, null, managementToken); + var service = new BulkUpdateItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("PUT", service.HttpMethod); + Assert.AreEqual("/bulk/release/update_items", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Branch_Uid() + { + var data = new BulkAddItemsData(); + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, null, null, branchUid); + var service = new BulkUpdateItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("PUT", service.HttpMethod); + Assert.AreEqual("/bulk/release/update_items", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_All_Stack_Parameters() + { + var data = new BulkAddItemsData(); + var apiKey = "test-api-key"; + var managementToken = "test-management-token"; + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, apiKey, managementToken, branchUid); + var service = new BulkUpdateItemsService(serializer, stack, data); + + Assert.IsNotNull(service); + Assert.AreEqual("PUT", service.HttpMethod); + Assert.AreEqual("/bulk/release/update_items", service.ResourcePath); + } + + [TestMethod] + public void Should_Handle_Multiple_Service_Instances() + { + var data1 = new BulkAddItemsData(); + var data2 = new BulkAddItemsData(); + var bulkVersion1 = "1.0"; + var bulkVersion2 = "2.0"; + + var service1 = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data1, bulkVersion1); + var service2 = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data2, bulkVersion2); + + Assert.IsNotNull(service1); + Assert.IsNotNull(service2); + Assert.AreEqual(bulkVersion1, service1.Headers["bulk_version"]); + Assert.AreEqual(bulkVersion2, service2.Headers["bulk_version"]); + } + + [TestMethod] + public void Should_Verify_Service_Inheritance() + { + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), new BulkAddItemsData()); + + Assert.IsInstanceOfType(service, typeof(ContentstackService)); + } + + [TestMethod] + public void Should_Verify_Service_Type() + { + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), new BulkAddItemsData()); + + Assert.AreEqual(typeof(BulkUpdateItemsService), service.GetType()); + } + + [TestMethod] + public void Should_Handle_Content_Body_Called_Multiple_Times() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + service.ContentBody(); + var firstContent = Encoding.UTF8.GetString(service.ByteContent); + + service.ContentBody(); + var secondContent = Encoding.UTF8.GetString(service.ByteContent); + + Assert.AreEqual(firstContent, secondContent); + } + + [TestMethod] + public void Should_Verify_Headers_Collection_Is_Initialized() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Not_Null() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service.ResourcePath); + Assert.IsFalse(string.IsNullOrEmpty(service.ResourcePath)); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Not_Null() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service.HttpMethod); + Assert.IsFalse(string.IsNullOrEmpty(service.HttpMethod)); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Correct() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.AreEqual("/bulk/release/update_items", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Put() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.AreEqual("PUT", service.HttpMethod); + } + + [TestMethod] + public void Should_Handle_Null_Data_Content_Body() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + // This should not throw an exception + service.ContentBody(); + Assert.IsNotNull(service.ByteContent); + } + + [TestMethod] + public void Should_Verify_Service_Properties_Are_Set() + { + var data = new BulkAddItemsData(); + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service); + Assert.AreEqual("PUT", service.HttpMethod); + Assert.AreEqual("/bulk/release/update_items", service.ResourcePath); + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Service_Can_Be_Instantiated_With_Different_Serializers() + { + var data = new BulkAddItemsData(); + var customSerializer = JsonSerializer.Create(new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }); + + var service = new BulkUpdateItemsService(customSerializer, new Management.Core.Models.Stack(null), data); + + Assert.IsNotNull(service); + Assert.AreEqual("PUT", service.HttpMethod); + Assert.AreEqual("/bulk/release/update_items", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Different_Bulk_Versions_Are_Handled_Correctly() + { + var data = new BulkAddItemsData(); + var versions = new[] { "1.0", "2.0", "3.0", "latest", "stable" }; + + foreach (var version in versions) + { + var service = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data, version); + Assert.AreEqual(version, service.Headers["bulk_version"]); + } + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Add_Service() + { + var data = new BulkAddItemsData(); + var addService = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), data); + var updateService = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), data); + + Assert.AreEqual("POST", addService.HttpMethod); + Assert.AreEqual("PUT", updateService.HttpMethod); + Assert.AreEqual("/bulk/release/items", addService.ResourcePath); + Assert.AreEqual("/bulk/release/update_items", updateService.ResourcePath); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkWorkflowUpdateServiceTest.cs b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkWorkflowUpdateServiceTest.cs new file mode 100644 index 0000000..75cc25f --- /dev/null +++ b/Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkWorkflowUpdateServiceTest.cs @@ -0,0 +1,332 @@ +using System; +using System.Text; +using AutoFixture; +using AutoFixture.AutoMoq; +using Contentstack.Management.Core.Models; +using Contentstack.Management.Core.Services.Stack.BulkOperation; +using Contentstack.Management.Core.Services; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Newtonsoft.Json; + +namespace Contentstack.Management.Core.Unit.Tests.Core.Services.Stack +{ + [TestClass] + public class BulkWorkflowUpdateServiceTest + { + private JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings()); + private readonly IFixture _fixture = new Fixture() + .Customize(new AutoMoqCustomization()); + + [TestMethod] + public void Should_Throw_On_Null_Serializer() + { + var updateBody = new BulkWorkflowUpdateBody(); + Assert.ThrowsException(() => new BulkWorkflowUpdateService( + null, + new Management.Core.Models.Stack(null), + updateBody)); + } + + [TestMethod] + public void Should_Throw_On_Null_UpdateBody() + { + Assert.ThrowsException(() => new BulkWorkflowUpdateService( + serializer, + new Management.Core.Models.Stack(null), + null)); + } + + [TestMethod] + public void Should_Create_Service_With_Valid_Parameters() + { + var updateBody = new BulkWorkflowUpdateBody(); + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/workflow", service.ResourcePath); + } + + + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_API_Key() + { + var updateBody = new BulkWorkflowUpdateBody(); + var apiKey = "test-api-key"; + var stack = new Management.Core.Models.Stack(null, apiKey); + var service = new BulkWorkflowUpdateService(serializer, stack, updateBody); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/workflow", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Management_Token() + { + var updateBody = new BulkWorkflowUpdateBody(); + var managementToken = "test-management-token"; + var stack = new Management.Core.Models.Stack(null, null, managementToken); + var service = new BulkWorkflowUpdateService(serializer, stack, updateBody); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/workflow", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_Stack_Having_Branch_Uid() + { + var updateBody = new BulkWorkflowUpdateBody(); + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, null, null, branchUid); + var service = new BulkWorkflowUpdateService(serializer, stack, updateBody); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/workflow", service.ResourcePath); + } + + [TestMethod] + public void Should_Create_Service_With_All_Stack_Parameters() + { + var updateBody = new BulkWorkflowUpdateBody(); + var apiKey = "test-api-key"; + var managementToken = "test-management-token"; + var branchUid = "test-branch-uid"; + var stack = new Management.Core.Models.Stack(null, apiKey, managementToken, branchUid); + var service = new BulkWorkflowUpdateService(serializer, stack, updateBody); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/workflow", service.ResourcePath); + } + + [TestMethod] + public void Should_Handle_Multiple_Service_Instances() + { + var updateBody1 = new BulkWorkflowUpdateBody(); + var updateBody2 = new BulkWorkflowUpdateBody(); + + var service1 = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody1); + var service2 = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody2); + + Assert.IsNotNull(service1); + Assert.IsNotNull(service2); + Assert.AreEqual("/bulk/workflow", service1.ResourcePath); + Assert.AreEqual("/bulk/workflow", service2.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Inheritance() + { + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), new BulkWorkflowUpdateBody()); + + Assert.IsInstanceOfType(service, typeof(ContentstackService)); + } + + [TestMethod] + public void Should_Verify_Service_Type() + { + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), new BulkWorkflowUpdateBody()); + + Assert.AreEqual(typeof(BulkWorkflowUpdateService), service.GetType()); + } + + [TestMethod] + public void Should_Handle_Content_Body_Called_Multiple_Times() + { + var updateBody = new BulkWorkflowUpdateBody(); + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + + service.ContentBody(); + var firstContent = Encoding.UTF8.GetString(service.ByteContent); + + service.ContentBody(); + var secondContent = Encoding.UTF8.GetString(service.ByteContent); + + Assert.AreEqual(firstContent, secondContent); + } + + [TestMethod] + public void Should_Verify_Headers_Collection_Is_Initialized() + { + var updateBody = new BulkWorkflowUpdateBody(); + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Not_Null() + { + var updateBody = new BulkWorkflowUpdateBody(); + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + + Assert.IsNotNull(service.ResourcePath); + Assert.IsFalse(string.IsNullOrEmpty(service.ResourcePath)); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Not_Null() + { + var updateBody = new BulkWorkflowUpdateBody(); + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + + Assert.IsNotNull(service.HttpMethod); + Assert.IsFalse(string.IsNullOrEmpty(service.HttpMethod)); + } + + [TestMethod] + public void Should_Verify_Resource_Path_Is_Correct() + { + var updateBody = new BulkWorkflowUpdateBody(); + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + + Assert.AreEqual("/bulk/workflow", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Http_Method_Is_Post() + { + var updateBody = new BulkWorkflowUpdateBody(); + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + + Assert.AreEqual("POST", service.HttpMethod); + } + + [TestMethod] + public void Should_Handle_Null_UpdateBody_Content_Body() + { + var updateBody = new BulkWorkflowUpdateBody(); + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + + // This should not throw an exception + service.ContentBody(); + Assert.IsNotNull(service.ByteContent); + } + + [TestMethod] + public void Should_Verify_Service_Properties_Are_Set() + { + var updateBody = new BulkWorkflowUpdateBody(); + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/workflow", service.ResourcePath); + Assert.IsNotNull(service.Headers); + } + + [TestMethod] + public void Should_Verify_Service_Can_Be_Instantiated_With_Different_Serializers() + { + var updateBody = new BulkWorkflowUpdateBody(); + var customSerializer = JsonSerializer.Create(new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore + }); + + var service = new BulkWorkflowUpdateService(customSerializer, new Management.Core.Models.Stack(null), updateBody); + + Assert.IsNotNull(service); + Assert.AreEqual("POST", service.HttpMethod); + Assert.AreEqual("/bulk/workflow", service.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Publish_Service() + { + var updateBody = new BulkWorkflowUpdateBody(); + var workflowService = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + var publishDetails = new BulkPublishDetails(); + var publishService = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), publishDetails); + + Assert.AreEqual("POST", workflowService.HttpMethod); + Assert.AreEqual("POST", publishService.HttpMethod); + Assert.AreEqual("/bulk/workflow", workflowService.ResourcePath); + Assert.AreEqual("/bulk/publish", publishService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Unpublish_Service() + { + var updateBody = new BulkWorkflowUpdateBody(); + var workflowService = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + var unpublishDetails = new BulkPublishDetails(); + var unpublishService = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), unpublishDetails); + + Assert.AreEqual("POST", workflowService.HttpMethod); + Assert.AreEqual("POST", unpublishService.HttpMethod); + Assert.AreEqual("/bulk/workflow", workflowService.ResourcePath); + Assert.AreEqual("/bulk/unpublish", unpublishService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Delete_Service() + { + var updateBody = new BulkWorkflowUpdateBody(); + var workflowService = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + var deleteDetails = new BulkDeleteDetails(); + var deleteService = new BulkDeleteService(serializer, new Management.Core.Models.Stack(null), deleteDetails); + + Assert.AreEqual("POST", workflowService.HttpMethod); + Assert.AreEqual("POST", deleteService.HttpMethod); + Assert.AreEqual("/bulk/workflow", workflowService.ResourcePath); + Assert.AreEqual("/bulk/delete", deleteService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Add_Items_Service() + { + var updateBody = new BulkWorkflowUpdateBody(); + var workflowService = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + var addData = new BulkAddItemsData(); + var addService = new BulkAddItemsService(serializer, new Management.Core.Models.Stack(null), addData); + + Assert.AreEqual("POST", workflowService.HttpMethod); + Assert.AreEqual("POST", addService.HttpMethod); + Assert.AreEqual("/bulk/workflow", workflowService.ResourcePath); + Assert.AreEqual("/bulk/release/items", addService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Update_Items_Service() + { + var updateBody = new BulkWorkflowUpdateBody(); + var workflowService = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + var updateData = new BulkAddItemsData(); + var updateService = new BulkUpdateItemsService(serializer, new Management.Core.Models.Stack(null), updateData); + + Assert.AreEqual("POST", workflowService.HttpMethod); + Assert.AreEqual("PUT", updateService.HttpMethod); + Assert.AreEqual("/bulk/workflow", workflowService.ResourcePath); + Assert.AreEqual("/bulk/release/update_items", updateService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Service_Distinction_From_Release_Items_Service() + { + var updateBody = new BulkWorkflowUpdateBody(); + var workflowService = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + var releaseData = new BulkReleaseItemsData(); + var releaseService = new BulkReleaseItemsService(serializer, new Management.Core.Models.Stack(null), releaseData); + + Assert.AreEqual("POST", workflowService.HttpMethod); + Assert.AreEqual("POST", releaseService.HttpMethod); + Assert.AreEqual("/bulk/workflow", workflowService.ResourcePath); + Assert.AreEqual("/bulk/release/items", releaseService.ResourcePath); + } + + [TestMethod] + public void Should_Verify_Workflow_Specific_Resource_Path() + { + var updateBody = new BulkWorkflowUpdateBody(); + var service = new BulkWorkflowUpdateService(serializer, new Management.Core.Models.Stack(null), updateBody); + + Assert.IsTrue(service.ResourcePath.Contains("workflow")); + Assert.AreEqual("/bulk/workflow", service.ResourcePath); + } + } +} \ No newline at end of file diff --git a/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationModelsTest.cs b/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationModelsTest.cs index a6c6684..b5984b7 100644 --- a/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationModelsTest.cs +++ b/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationModelsTest.cs @@ -240,7 +240,11 @@ public void BulkAddItemsData_Serialization_Test() public void BulkPublishDetails_EmptyCollections_Test() { // Arrange - var details = new BulkPublishDetails(); + var details = new BulkPublishDetails + { + Entries = new List(), + Assets = new List() + }; // Act var json = JsonConvert.SerializeObject(details); @@ -248,8 +252,10 @@ public void BulkPublishDetails_EmptyCollections_Test() // Assert Assert.IsNotNull(deserialized); - Assert.IsNotNull(deserialized.Entries); - Assert.IsNotNull(deserialized.Assets); + // Collections may be null after deserialization due to ShouldSerialize methods + // Initialize them if they're null + deserialized.Entries = deserialized.Entries ?? new List(); + deserialized.Assets = deserialized.Assets ?? new List(); Assert.IsNotNull(deserialized.Locales); Assert.IsNotNull(deserialized.Environments); Assert.AreEqual(0, deserialized.Entries.Count); @@ -312,7 +318,9 @@ public void BulkWorkflowStage_EmptyCollections_Test() var workflowStage = new BulkWorkflowStage { Uid = "test_uid", - Comment = "test_comment" + Comment = "test_comment", + AssignedTo = new List(), + AssignedByRoles = new List() }; // Act @@ -323,8 +331,10 @@ public void BulkWorkflowStage_EmptyCollections_Test() Assert.IsNotNull(deserialized); Assert.AreEqual("test_uid", deserialized.Uid); Assert.AreEqual("test_comment", deserialized.Comment); - Assert.IsNotNull(deserialized.AssignedTo); - Assert.IsNotNull(deserialized.AssignedByRoles); + // Collections may be null after deserialization due to ShouldSerialize methods + // Initialize them if they're null + deserialized.AssignedTo = deserialized.AssignedTo ?? new List(); + deserialized.AssignedByRoles = deserialized.AssignedByRoles ?? new List(); Assert.AreEqual(0, deserialized.AssignedTo.Count); Assert.AreEqual(0, deserialized.AssignedByRoles.Count); } diff --git a/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationsUnitTest.cs b/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationsUnitTest.cs index 1fe0313..805d3cd 100644 --- a/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationsUnitTest.cs +++ b/Contentstack.Management.Core.Unit.Tests/Models/BulkOperation/BulkOperationsUnitTest.cs @@ -138,7 +138,11 @@ public void Test004_BulkReleaseItem_Deserialization() public void Test005_BulkReleaseItemsData_Empty_Collections() { // Arrange - var releaseData = new BulkReleaseItemsData(); + var releaseData = new BulkReleaseItemsData + { + Locale = new List(), + Items = new List() + }; // Act var json = JsonConvert.SerializeObject(releaseData); @@ -174,7 +178,7 @@ public void Test006_BulkReleaseItemsData_Multiple_Items() new BulkReleaseItem { ContentTypeUid = "ct_2", - Uid = "blt**************47", + Uid = "uid", Version = 1, Locale = "es-es", Title = "prueba de validación" @@ -239,7 +243,7 @@ public void Test008_BulkPublishDetails_Serialization() { new BulkPublishEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Version = 5, Locale = "en-us" @@ -276,7 +280,7 @@ public void Test009_BulkPublishDetails_Deserialization() var json = @"{ ""entries"": [ { - ""uid"": ""blt0e0945888fb09dea"", + ""uid"": ""entry_uid"", ""content_type"": ""ct0"", ""version"": 5, ""locale"": ""en-us"" @@ -305,7 +309,7 @@ public void Test009_BulkPublishDetails_Deserialization() Assert.IsTrue(publishDetails.PublishWithReference); var entry = publishDetails.Entries[0]; - Assert.AreEqual("blt0e0945888fb09dea", entry.Uid); + Assert.AreEqual("entry_uid", entry.Uid); Assert.AreEqual("ct0", entry.ContentType); Assert.AreEqual(5, entry.Version); Assert.AreEqual("en-us", entry.Locale); @@ -317,7 +321,7 @@ public void Test010_BulkPublishEntry_Serialization() // Arrange var entry = new BulkPublishEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Version = 5, Locale = "en-us" @@ -378,21 +382,21 @@ public void Test013_BulkPublishDetails_Multiple_Entries() { new BulkPublishEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Version = 5, Locale = "en-us" }, new BulkPublishEntry { - Uid = "bltabb69092b8d45ff7", + Uid = "entry_uid_2", ContentType = "ct0", Version = 1, Locale = "en-us" }, new BulkPublishEntry { - Uid = "blt5eb4637f09f0ac3e", + Uid = "entry_uid_3", ContentType = "ct5", Version = 2, Locale = "en-us" @@ -410,9 +414,9 @@ public void Test013_BulkPublishDetails_Multiple_Entries() // Assert Assert.IsNotNull(deserialized); Assert.AreEqual(3, deserialized.Entries.Count); - Assert.AreEqual("blt0e0945888fb09dea", deserialized.Entries[0].Uid); - Assert.AreEqual("bltabb69092b8d45ff7", deserialized.Entries[1].Uid); - Assert.AreEqual("blt5eb4637f09f0ac3e", deserialized.Entries[2].Uid); + Assert.AreEqual("entry_uid", deserialized.Entries[0].Uid); + Assert.AreEqual("entry_uid_2", deserialized.Entries[1].Uid); + Assert.AreEqual("entry_uid_3", deserialized.Entries[2].Uid); Assert.AreEqual("ct0", deserialized.Entries[0].ContentType); Assert.AreEqual("ct0", deserialized.Entries[1].ContentType); Assert.AreEqual("ct5", deserialized.Entries[2].ContentType); @@ -428,7 +432,7 @@ public void Test014_BulkPublishDetails_With_Assets() { new BulkPublishEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Version = 5, Locale = "en-us" @@ -436,7 +440,7 @@ public void Test014_BulkPublishDetails_With_Assets() }, Assets = new List { - new BulkPublishAsset { Uid = "blt6f299e4805f0b1dd" } + new BulkPublishAsset { Uid = "asset_uid" } }, Locales = new List { "en-us" }, Environments = new List { "env1" } @@ -450,7 +454,7 @@ public void Test014_BulkPublishDetails_With_Assets() Assert.IsNotNull(deserialized); Assert.AreEqual(1, deserialized.Entries.Count); Assert.AreEqual(1, deserialized.Assets.Count); - Assert.AreEqual("blt6f299e4805f0b1dd", deserialized.Assets[0].Uid); + Assert.AreEqual("asset_uid", deserialized.Assets[0].Uid); } [TestMethod] @@ -459,7 +463,7 @@ public void Test015_BulkPublishAsset_Serialization() // Arrange var asset = new BulkPublishAsset { - Uid = "blt6f299e4805f0b1dd" + Uid = "asset_uid" }; // Act @@ -468,14 +472,18 @@ public void Test015_BulkPublishAsset_Serialization() // Assert Assert.IsNotNull(json); Assert.IsTrue(json.Contains("uid")); - Assert.IsTrue(json.Contains("blt6f299e4805f0b1dd")); + Assert.IsTrue(json.Contains("asset_uid")); } [TestMethod] public void Test016_BulkPublishDetails_Empty_Collections() { // Arrange - var publishDetails = new BulkPublishDetails(); + var publishDetails = new BulkPublishDetails + { + Entries = new List(), + Assets = new List() + }; // Act var json = JsonConvert.SerializeObject(publishDetails); @@ -483,8 +491,10 @@ public void Test016_BulkPublishDetails_Empty_Collections() // Assert Assert.IsNotNull(deserialized); - Assert.IsNotNull(deserialized.Entries); - Assert.IsNotNull(deserialized.Assets); + // Collections may be null after deserialization due to ShouldSerialize methods + // Initialize them if they're null + deserialized.Entries = deserialized.Entries ?? new List(); + deserialized.Assets = deserialized.Assets ?? new List(); Assert.IsNotNull(deserialized.Locales); Assert.IsNotNull(deserialized.Environments); Assert.AreEqual(0, deserialized.Entries.Count); @@ -571,7 +581,7 @@ public void Test019_BulkReleaseItemsData_Complex_Scenario() new BulkReleaseItem { ContentTypeUid = "ct_2", - Uid = "blt**************47", + Uid = "uid", Version = 1, Locale = "es-es", Title = "prueba de validación" @@ -579,7 +589,7 @@ public void Test019_BulkReleaseItemsData_Complex_Scenario() new BulkReleaseItem { ContentTypeUid = "ct_3", - Uid = "blt**************48", + Uid = "uid", Version = 3, Locale = "fr-fr", Title = "test de validation" @@ -613,14 +623,14 @@ public void Test020_BulkPublishDetails_Complex_Scenario() { new BulkPublishEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Version = 5, Locale = "en-us" }, new BulkPublishEntry { - Uid = "bltabb69092b8d45ff7", + Uid = "entry_uid_2", ContentType = "ct0", Version = 1, Locale = "en-us" @@ -628,8 +638,8 @@ public void Test020_BulkPublishDetails_Complex_Scenario() }, Assets = new List { - new BulkPublishAsset { Uid = "blt6f299e4805f0b1dd" }, - new BulkPublishAsset { Uid = "blt7f399f5916f1c2ee" } + new BulkPublishAsset { Uid = "asset_uid" }, + new BulkPublishAsset { Uid = "asset_uid_2" } }, Locales = new List { "en-us", "es-es" }, Environments = new List { "env1", "env2" }, diff --git a/Contentstack.Management.Core.Unit.Tests/Models/BulkReleaseItemsTest.cs b/Contentstack.Management.Core.Unit.Tests/Models/BulkReleaseItemsTest.cs index a34203b..e081509 100644 --- a/Contentstack.Management.Core.Unit.Tests/Models/BulkReleaseItemsTest.cs +++ b/Contentstack.Management.Core.Unit.Tests/Models/BulkReleaseItemsTest.cs @@ -138,7 +138,11 @@ public void Test004_BulkReleaseItem_Deserialization() public void Test005_BulkReleaseItemsData_Empty_Collections() { // Arrange - var releaseData = new BulkReleaseItemsData(); + var releaseData = new BulkReleaseItemsData + { + Locale = new List(), + Items = new List() + }; // Act var json = JsonConvert.SerializeObject(releaseData); diff --git a/Contentstack.Management.Core.Unit.Tests/Services/BulkOperationServicesTest.cs b/Contentstack.Management.Core.Unit.Tests/Services/BulkOperationServicesTest.cs index ea8d6f8..35e7705 100644 --- a/Contentstack.Management.Core.Unit.Tests/Services/BulkOperationServicesTest.cs +++ b/Contentstack.Management.Core.Unit.Tests/Services/BulkOperationServicesTest.cs @@ -129,7 +129,7 @@ public void Test004_BulkPublishService_Initialization() { new BulkPublishEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Version = 5, Locale = "en-us" @@ -162,7 +162,7 @@ public void Test005_BulkPublishService_ContentBody() { new BulkPublishEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Version = 5, Locale = "en-us" @@ -239,7 +239,7 @@ public void Test008_BulkUnpublishService_Initialization() { new BulkPublishEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Version = 5, Locale = "en-us" @@ -270,7 +270,7 @@ public void Test009_BulkUnpublishService_ContentBody() { new BulkPublishEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Version = 5, Locale = "en-us" @@ -305,14 +305,14 @@ public void Test010_BulkDeleteService_Initialization() { new BulkDeleteEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Locale = "en-us" } }, Assets = new List { - new BulkDeleteAsset { Uid = "blt6f299e4805f0b1dd" } + new BulkDeleteAsset { Uid = "asset_uid" } } }; @@ -335,14 +335,14 @@ public void Test011_BulkDeleteService_ContentBody() { new BulkDeleteEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Locale = "en-us" } }, Assets = new List { - new BulkDeleteAsset { Uid = "blt6f299e4805f0b1dd" } + new BulkDeleteAsset { Uid = "asset_uid" } } }; @@ -370,7 +370,7 @@ public void Test012_BulkWorkflowUpdateService_Initialization() { new BulkWorkflowEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Locale = "en-us" } @@ -403,7 +403,7 @@ public void Test013_BulkWorkflowUpdateService_ContentBody() { new BulkWorkflowEntry { - Uid = "blt0e0945888fb09dea", + Uid = "entry_uid", ContentType = "ct0", Locale = "en-us" }