Skip to content

Commit 08e18f0

Browse files
authored
Merge pull request #136 from contentstack/enhc/DX-3233
feat(DX-3233): Bulk publish/unpublish query params, api_version tests, and robust error handling
2 parents 904fe3d + d4ee350 commit 08e18f0

File tree

11 files changed

+1159
-120
lines changed

11 files changed

+1159
-120
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## [v0.7.0](https://github.com/contentstack/contentstack-management-dotnet/tree/v0.7.0)
4+
- Feat
5+
- **Bulk publish/unpublish: query parameters (DX-3233)**
6+
- `skip_workflow_stage_check` and `approvals` are now sent as query parameters instead of headers for bulk publish and bulk unpublish
7+
- Unit tests updated to assert on `QueryResources` for these flags (BulkPublishServiceTest, BulkUnpublishServiceTest, BulkOperationServicesTest)
8+
- Integration tests: bulk publish with skipWorkflowStage and approvals (Test003a), bulk unpublish with skipWorkflowStage and approvals (Test004a), and helper `EnsureBulkTestContentTypeAndEntriesAsync()` so bulk tests can run in any order
9+
310
## [v0.6.1](https://github.com/contentstack/contentstack-management-dotnet/tree/v0.6.1) (2026-02-02)
411
- Fix
512
- Release DELETE request no longer includes Content-Type header to comply with API requirements

Contentstack.Management.Core.Tests/Contentstack.Management.Core.Tests.csproj

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
<PackageReference Include="AutoFixture.AutoMoq" Version="4.18.1" />
2525
<PackageReference Include="Moq" Version="4.20.72" />
2626
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.3.0" />
27+
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
2728
</ItemGroup>
2829

2930
<ItemGroup>
@@ -35,14 +36,17 @@
3536
<ItemGroup>
3637
<EmbeddedResource Include="Mock\*.json" />
3738
</ItemGroup>
39+
3840
<ItemGroup>
39-
<Content Include="appsettings.json">
41+
<Content Include="appSettings.json">
4042
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
4143
</Content>
4244
</ItemGroup>
45+
4346
<ItemGroup>
4447
<None Remove="Microsoft.AspNetCore.Http" />
4548
</ItemGroup>
49+
4650
<ItemGroup>
4751
<ProjectReference Include="..\Contentstack.Management.Core\contentstack.management.core.csproj" />
4852
</ItemGroup>

Contentstack.Management.Core.Tests/IntegrationTest/Contentstack015_BulkOperationTest.cs

Lines changed: 1113 additions & 85 deletions
Large diffs are not rendered by default.

Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkPublishServiceTest.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,25 +48,25 @@ public void Should_Create_Service_With_Valid_Parameters()
4848
}
4949

5050
[TestMethod]
51-
public void Should_Set_Skip_Workflow_Stage_Header_When_True()
51+
public void Should_Set_Skip_Workflow_Stage_Query_Parameter_When_True()
5252
{
5353
var details = new BulkPublishDetails();
5454
var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details, skipWorkflowStage: true);
5555

5656
Assert.IsNotNull(service);
57-
Assert.IsTrue(service.Headers.ContainsKey("skip_workflow_stage_check"));
58-
Assert.AreEqual("true", service.Headers["skip_workflow_stage_check"]);
57+
Assert.IsTrue(service.QueryResources.ContainsKey("skip_workflow_stage_check"));
58+
Assert.AreEqual("true", service.QueryResources["skip_workflow_stage_check"]);
5959
}
6060

6161
[TestMethod]
62-
public void Should_Set_Approvals_Header_When_True()
62+
public void Should_Set_Approvals_Query_Parameter_When_True()
6363
{
6464
var details = new BulkPublishDetails();
6565
var service = new BulkPublishService(serializer, new Management.Core.Models.Stack(null), details, approvals: true);
6666

6767
Assert.IsNotNull(service);
68-
Assert.IsTrue(service.Headers.ContainsKey("approvals"));
69-
Assert.AreEqual("true", service.Headers["approvals"]);
68+
Assert.IsTrue(service.QueryResources.ContainsKey("approvals"));
69+
Assert.AreEqual("true", service.QueryResources["approvals"]);
7070
}
7171

7272
[TestMethod]

Contentstack.Management.Core.Unit.Tests/Core/Services/Stack/BulkUnpublishServiceTest.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,25 +48,25 @@ public void Should_Create_Service_With_Valid_Parameters()
4848
}
4949

5050
[TestMethod]
51-
public void Should_Set_Skip_Workflow_Stage_Header_When_True()
51+
public void Should_Set_Skip_Workflow_Stage_Query_Parameter_When_True()
5252
{
5353
var details = new BulkPublishDetails();
5454
var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details, skipWorkflowStage: true);
5555

5656
Assert.IsNotNull(service);
57-
Assert.IsTrue(service.Headers.ContainsKey("skip_workflow_stage_check"));
58-
Assert.AreEqual("true", service.Headers["skip_workflow_stage_check"]);
57+
Assert.IsTrue(service.QueryResources.ContainsKey("skip_workflow_stage_check"));
58+
Assert.AreEqual("true", service.QueryResources["skip_workflow_stage_check"]);
5959
}
6060

6161
[TestMethod]
62-
public void Should_Set_Approvals_Header_When_True()
62+
public void Should_Set_Approvals_Query_Parameter_When_True()
6363
{
6464
var details = new BulkPublishDetails();
6565
var service = new BulkUnpublishService(serializer, new Management.Core.Models.Stack(null), details, approvals: true);
6666

6767
Assert.IsNotNull(service);
68-
Assert.IsTrue(service.Headers.ContainsKey("approvals"));
69-
Assert.AreEqual("true", service.Headers["approvals"]);
68+
Assert.IsTrue(service.QueryResources.ContainsKey("approvals"));
69+
Assert.AreEqual("true", service.QueryResources["approvals"]);
7070
}
7171

7272
[TestMethod]

Contentstack.Management.Core.Unit.Tests/Services/BulkOperationServicesTest.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,10 @@ public void Test004_BulkPublishService_Initialization()
142142
Assert.IsNotNull(service);
143143
Assert.AreEqual("/bulk/publish", service.ResourcePath);
144144
Assert.AreEqual("POST", service.HttpMethod);
145-
Assert.IsTrue(service.Headers.ContainsKey("skip_workflow_stage_check"));
146-
Assert.IsTrue(service.Headers.ContainsKey("approvals"));
147-
Assert.AreEqual("true", service.Headers["skip_workflow_stage_check"]);
148-
Assert.AreEqual("true", service.Headers["approvals"]);
145+
Assert.IsTrue(service.QueryResources.ContainsKey("skip_workflow_stage_check"));
146+
Assert.IsTrue(service.QueryResources.ContainsKey("approvals"));
147+
Assert.AreEqual("true", service.QueryResources["skip_workflow_stage_check"]);
148+
Assert.AreEqual("true", service.QueryResources["approvals"]);
149149
}
150150

151151
[TestMethod]
@@ -197,10 +197,10 @@ public void Test006_BulkPublishService_With_All_Flags()
197197
var service = new BulkPublishService(_serializer, _stack, publishDetails, true, true, true);
198198

199199
Assert.IsNotNull(service);
200-
Assert.IsTrue(service.Headers.ContainsKey("skip_workflow_stage_check"));
201-
Assert.IsTrue(service.Headers.ContainsKey("approvals"));
202-
Assert.AreEqual("true", service.Headers["skip_workflow_stage_check"]);
203-
Assert.AreEqual("true", service.Headers["approvals"]);
200+
Assert.IsTrue(service.QueryResources.ContainsKey("skip_workflow_stage_check"));
201+
Assert.IsTrue(service.QueryResources.ContainsKey("approvals"));
202+
Assert.AreEqual("true", service.QueryResources["skip_workflow_stage_check"]);
203+
Assert.AreEqual("true", service.QueryResources["approvals"]);
204204
}
205205

206206
[TestMethod]
@@ -218,8 +218,8 @@ public void Test007_BulkPublishService_Without_Flags()
218218
var service = new BulkPublishService(_serializer, _stack, publishDetails, false, false, false);
219219

220220
Assert.IsNotNull(service);
221-
Assert.IsFalse(service.Headers.ContainsKey("skip_workflow_stage_check"));
222-
Assert.IsFalse(service.Headers.ContainsKey("approvals"));
221+
Assert.IsFalse(service.QueryResources.ContainsKey("skip_workflow_stage_check"));
222+
Assert.IsFalse(service.QueryResources.ContainsKey("approvals"));
223223
}
224224

225225
[TestMethod]
@@ -248,8 +248,8 @@ public void Test008_BulkUnpublishService_Initialization()
248248
Assert.IsNotNull(service);
249249
Assert.AreEqual("/bulk/unpublish", service.ResourcePath);
250250
Assert.AreEqual("POST", service.HttpMethod);
251-
Assert.IsTrue(service.Headers.ContainsKey("skip_workflow_stage_check"));
252-
Assert.IsTrue(service.Headers.ContainsKey("approvals"));
251+
Assert.IsTrue(service.QueryResources.ContainsKey("skip_workflow_stage_check"));
252+
Assert.IsTrue(service.QueryResources.ContainsKey("approvals"));
253253
}
254254

255255
[TestMethod]

Contentstack.Management.Core/Models/Workflow.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using System.Threading.Tasks;
33
using Contentstack.Management.Core.Queryable;
44
using Contentstack.Management.Core.Services.Models;
@@ -9,7 +9,7 @@ namespace Contentstack.Management.Core.Models
99
public class Workflow: BaseModel<WorkflowModel>
1010
{
1111
internal Workflow(Stack stack, string uid)
12-
: base(stack, "workflows", uid)
12+
: base(stack, "workflow", uid)
1313
{
1414
resourcePath = uid == null ? "/workflows" : $"/workflows/{uid}";
1515
}

Contentstack.Management.Core/Models/WorkflowModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Collections.Generic;
1+
using System.Collections.Generic;
22
using Newtonsoft.Json;
33
namespace Contentstack.Management.Core.Models
44
{
@@ -37,7 +37,7 @@ public class WorkflowStage
3737
public bool AllUsers { get; set; } = true;
3838
[JsonProperty(propertyName: "specificStages")]
3939
public bool SpecificStages { get; set; } = false;
40-
[JsonProperty(propertyName: "enabspecificUsersled")]
40+
[JsonProperty(propertyName: "specificUsers")]
4141
public bool SpecificUsers { get; set; } = false;
4242
[JsonProperty(propertyName: "entry_lock")]
4343
public string EntryLock { get; set; }

Contentstack.Management.Core/Services/Stack/BulkOperation/BulkPublishService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ public BulkPublishService(JsonSerializer serializer, Contentstack.Management.Cor
3535
ResourcePath = "/bulk/publish";
3636
HttpMethod = "POST";
3737

38-
// Set headers based on parameters
38+
// Set query parameters based on options
3939
if (_skipWorkflowStage)
4040
{
41-
Headers["skip_workflow_stage_check"] = "true";
41+
AddQueryResource("skip_workflow_stage_check", "true");
4242
}
4343

4444
if (_approvals)
4545
{
46-
Headers["approvals"] = "true";
46+
AddQueryResource("approvals", "true");
4747
}
4848

4949
if (_isNested)

Contentstack.Management.Core/Services/Stack/BulkOperation/BulkUnpublishService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,12 @@ public BulkUnpublishService(JsonSerializer serializer, Contentstack.Management.C
3838
// Set headers based on parameters
3939
if (_skipWorkflowStage)
4040
{
41-
Headers["skip_workflow_stage_check"] = "true";
41+
AddQueryResource("skip_workflow_stage_check", "true");
4242
}
4343

4444
if (_approvals)
4545
{
46-
Headers["approvals"] = "true";
46+
AddQueryResource("approvals", "true");
4747
}
4848

4949
if (_isNested)

0 commit comments

Comments
 (0)