Skip to content

Commit 130fbdd

Browse files
committed
feat: Add full Taxonomy and Terms API to .NET CMA SDK
- Add Taxonomy and Term support to match the JavaScript CMA SDK. Models: - TaxonomyModel, TermModel (with TermAncestorDescendant, TermMoveModel), TaxonomyImportModel (IUploadInterface for multipart import). Taxonomy: - CRUD, Query(), Export(), Locales(), Localize(), Import(), Terms(termUid). - Stack.Taxonomy(uid) entry point. Term: - CRUD, Query(), Ancestors(), Descendants(), Move(), Locales(), Localize(), Search(typeahead). - Accessed via Stack.Taxonomy(taxonomyUid).Terms() / .Terms(termUid). Services: - Reuse CreateUpdateService, FetchDeleteService, QueryService; extend UploadService with optional query params for Import. Tests: - Unit: TaxonomyTest, TermTest (20 tests). Integration: Contentstack017_TaxonomyTest (create, fetch, query, update, delete). Use static taxonomy UID in integration test so all steps use the same created taxonomy.
1 parent d4ee350 commit 130fbdd

File tree

11 files changed

+1036
-5
lines changed

11 files changed

+1036
-5
lines changed
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Contentstack.Management.Core.Models;
4+
using Contentstack.Management.Core.Tests.Model;
5+
using Microsoft.VisualStudio.TestTools.UnitTesting;
6+
7+
namespace Contentstack.Management.Core.Tests.IntegrationTest
8+
{
9+
[TestClass]
10+
public class Contentstack017_TaxonomyTest
11+
{
12+
private static string _taxonomyUid;
13+
private Stack _stack;
14+
private TaxonomyModel _createModel;
15+
16+
[TestInitialize]
17+
public void Initialize()
18+
{
19+
StackResponse response = StackResponse.getStack(Contentstack.Client.serializer);
20+
_stack = Contentstack.Client.Stack(response.Stack.APIKey);
21+
if (_taxonomyUid == null)
22+
_taxonomyUid = "taxonomy_integration_test_" + Guid.NewGuid().ToString("N").Substring(0, 8);
23+
_createModel = new TaxonomyModel
24+
{
25+
Uid = _taxonomyUid,
26+
Name = "Taxonomy Integration Test",
27+
Description = "Description for taxonomy integration test"
28+
};
29+
}
30+
31+
[TestMethod]
32+
[DoNotParallelize]
33+
public void Test001_Should_Create_Taxonomy()
34+
{
35+
ContentstackResponse response = _stack.Taxonomy().Create(_createModel);
36+
Assert.IsTrue(response.IsSuccessStatusCode, $"Create failed: {response.OpenResponse()}");
37+
38+
var wrapper = response.OpenTResponse<TaxonomyResponseModel>();
39+
Assert.IsNotNull(wrapper?.Taxonomy);
40+
Assert.AreEqual(_createModel.Uid, wrapper.Taxonomy.Uid);
41+
Assert.AreEqual(_createModel.Name, wrapper.Taxonomy.Name);
42+
Assert.AreEqual(_createModel.Description, wrapper.Taxonomy.Description);
43+
}
44+
45+
[TestMethod]
46+
[DoNotParallelize]
47+
public void Test002_Should_Fetch_Taxonomy()
48+
{
49+
ContentstackResponse response = _stack.Taxonomy(_taxonomyUid).Fetch();
50+
Assert.IsTrue(response.IsSuccessStatusCode, $"Fetch failed: {response.OpenResponse()}");
51+
52+
var wrapper = response.OpenTResponse<TaxonomyResponseModel>();
53+
Assert.IsNotNull(wrapper?.Taxonomy);
54+
Assert.AreEqual(_taxonomyUid, wrapper.Taxonomy.Uid);
55+
Assert.IsNotNull(wrapper.Taxonomy.Name);
56+
}
57+
58+
[TestMethod]
59+
[DoNotParallelize]
60+
public void Test003_Should_Query_Taxonomies()
61+
{
62+
ContentstackResponse response = _stack.Taxonomy().Query().Find();
63+
Assert.IsTrue(response.IsSuccessStatusCode, $"Query failed: {response.OpenResponse()}");
64+
65+
var wrapper = response.OpenTResponse<TaxonomiesResponseModel>();
66+
Assert.IsNotNull(wrapper?.Taxonomies);
67+
Assert.IsTrue(wrapper.Taxonomies.Count >= 0);
68+
}
69+
70+
[TestMethod]
71+
[DoNotParallelize]
72+
public void Test004_Should_Update_Taxonomy()
73+
{
74+
var updateModel = new TaxonomyModel
75+
{
76+
Name = "Taxonomy Integration Test Updated",
77+
Description = "Updated description"
78+
};
79+
ContentstackResponse response = _stack.Taxonomy(_taxonomyUid).Update(updateModel);
80+
Assert.IsTrue(response.IsSuccessStatusCode, $"Update failed: {response.OpenResponse()}");
81+
82+
var wrapper = response.OpenTResponse<TaxonomyResponseModel>();
83+
Assert.IsNotNull(wrapper?.Taxonomy);
84+
Assert.AreEqual("Taxonomy Integration Test Updated", wrapper.Taxonomy.Name);
85+
Assert.AreEqual("Updated description", wrapper.Taxonomy.Description);
86+
}
87+
88+
[TestMethod]
89+
[DoNotParallelize]
90+
public async Task Test005_Should_Fetch_Taxonomy_Async()
91+
{
92+
ContentstackResponse response = await _stack.Taxonomy(_taxonomyUid).FetchAsync();
93+
Assert.IsTrue(response.IsSuccessStatusCode, $"FetchAsync failed: {response.OpenResponse()}");
94+
95+
var wrapper = response.OpenTResponse<TaxonomyResponseModel>();
96+
Assert.IsNotNull(wrapper?.Taxonomy);
97+
Assert.AreEqual(_taxonomyUid, wrapper.Taxonomy.Uid);
98+
}
99+
100+
[TestMethod]
101+
[DoNotParallelize]
102+
public void Test006_Should_Delete_Taxonomy()
103+
{
104+
ContentstackResponse response = _stack.Taxonomy(_taxonomyUid).Delete();
105+
Assert.IsTrue(response.IsSuccessStatusCode, $"Delete failed: {response.OpenResponse()}");
106+
}
107+
}
108+
}

Contentstack.Management.Core.Tests/Model/Models.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using Newtonsoft.Json;
1+
using Newtonsoft.Json;
22
using Contentstack.Management.Core.Models;
33
using System.Collections.Generic;
44

@@ -25,5 +25,17 @@ public class ContentTypesModel
2525
[JsonProperty("content_types")]
2626
public List<ContentModelling> Modellings { get; set; }
2727
}
28+
29+
public class TaxonomyResponseModel
30+
{
31+
[JsonProperty("taxonomy")]
32+
public TaxonomyModel Taxonomy { get; set; }
33+
}
34+
35+
public class TaxonomiesResponseModel
36+
{
37+
[JsonProperty("taxonomies")]
38+
public List<TaxonomyModel> Taxonomies { get; set; }
39+
}
2840
}
2941

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
using System;
2+
using AutoFixture;
3+
using Contentstack.Management.Core.Models;
4+
using Contentstack.Management.Core.Queryable;
5+
using Contentstack.Management.Core.Unit.Tests.Mokes;
6+
using Microsoft.VisualStudio.TestTools.UnitTesting;
7+
8+
namespace Contentstack.Management.Core.Unit.Tests.Models
9+
{
10+
[TestClass]
11+
public class TaxonomyTest
12+
{
13+
private Stack _stack;
14+
private readonly IFixture _fixture = new Fixture();
15+
private ContentstackResponse _contentstackResponse;
16+
17+
[TestInitialize]
18+
public void Initialize()
19+
{
20+
var client = new ContentstackClient();
21+
_contentstackResponse = MockResponse.CreateContentstackResponse("MockResponse.txt");
22+
client.ContentstackPipeline.ReplaceHandler(new MockHttpHandler(_contentstackResponse));
23+
client.contentstackOptions.Authtoken = _fixture.Create<string>();
24+
_stack = new Stack(client, _fixture.Create<string>());
25+
}
26+
27+
[TestMethod]
28+
public void Initialize_Taxonomy()
29+
{
30+
Taxonomy taxonomy = _stack.Taxonomy();
31+
32+
Assert.IsNull(taxonomy.Uid);
33+
Assert.AreEqual("/taxonomies", taxonomy.resourcePath);
34+
Assert.ThrowsException<InvalidOperationException>(() => taxonomy.Fetch());
35+
Assert.ThrowsExceptionAsync<InvalidOperationException>(() => taxonomy.FetchAsync());
36+
Assert.ThrowsException<InvalidOperationException>(() => taxonomy.Update(_fixture.Create<TaxonomyModel>()));
37+
Assert.ThrowsExceptionAsync<InvalidOperationException>(() => taxonomy.UpdateAsync(_fixture.Create<TaxonomyModel>()));
38+
Assert.ThrowsException<InvalidOperationException>(() => taxonomy.Delete());
39+
Assert.ThrowsExceptionAsync<InvalidOperationException>(() => taxonomy.DeleteAsync());
40+
Assert.ThrowsException<InvalidOperationException>(() => taxonomy.Terms());
41+
Assert.AreEqual(typeof(Query), taxonomy.Query().GetType());
42+
}
43+
44+
[TestMethod]
45+
public void Initialize_Taxonomy_With_Uid()
46+
{
47+
string uid = _fixture.Create<string>();
48+
Taxonomy taxonomy = _stack.Taxonomy(uid);
49+
50+
Assert.AreEqual(uid, taxonomy.Uid);
51+
Assert.AreEqual($"/taxonomies/{uid}", taxonomy.resourcePath);
52+
Assert.ThrowsException<InvalidOperationException>(() => taxonomy.Create(_fixture.Create<TaxonomyModel>()));
53+
Assert.ThrowsExceptionAsync<InvalidOperationException>(() => taxonomy.CreateAsync(_fixture.Create<TaxonomyModel>()));
54+
Assert.ThrowsException<InvalidOperationException>(() => taxonomy.Query());
55+
}
56+
57+
[TestMethod]
58+
public void Should_Create_Taxonomy()
59+
{
60+
ContentstackResponse response = _stack.Taxonomy().Create(_fixture.Create<TaxonomyModel>());
61+
62+
Assert.AreEqual(_contentstackResponse.OpenResponse(), response.OpenResponse());
63+
Assert.AreEqual(_contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString());
64+
}
65+
66+
[TestMethod]
67+
public async System.Threading.Tasks.Task Should_Create_Taxonomy_Async()
68+
{
69+
ContentstackResponse response = await _stack.Taxonomy().CreateAsync(_fixture.Create<TaxonomyModel>());
70+
71+
Assert.AreEqual(_contentstackResponse.OpenResponse(), response.OpenResponse());
72+
Assert.AreEqual(_contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString());
73+
}
74+
75+
[TestMethod]
76+
public void Should_Query_Taxonomy()
77+
{
78+
ContentstackResponse response = _stack.Taxonomy().Query().Find();
79+
80+
Assert.AreEqual(_contentstackResponse.OpenResponse(), response.OpenResponse());
81+
Assert.AreEqual(_contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString());
82+
}
83+
84+
[TestMethod]
85+
public async System.Threading.Tasks.Task Should_Query_Taxonomy_Async()
86+
{
87+
ContentstackResponse response = await _stack.Taxonomy().Query().FindAsync();
88+
89+
Assert.AreEqual(_contentstackResponse.OpenResponse(), response.OpenResponse());
90+
Assert.AreEqual(_contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString());
91+
}
92+
93+
[TestMethod]
94+
public void Should_Fetch_Taxonomy()
95+
{
96+
ContentstackResponse response = _stack.Taxonomy(_fixture.Create<string>()).Fetch();
97+
98+
Assert.AreEqual(_contentstackResponse.OpenResponse(), response.OpenResponse());
99+
Assert.AreEqual(_contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString());
100+
}
101+
102+
[TestMethod]
103+
public async System.Threading.Tasks.Task Should_Fetch_Taxonomy_Async()
104+
{
105+
ContentstackResponse response = await _stack.Taxonomy(_fixture.Create<string>()).FetchAsync();
106+
107+
Assert.AreEqual(_contentstackResponse.OpenResponse(), response.OpenResponse());
108+
Assert.AreEqual(_contentstackResponse.OpenJObjectResponse().ToString(), response.OpenJObjectResponse().ToString());
109+
}
110+
111+
[TestMethod]
112+
public void Should_Get_Terms_From_Taxonomy()
113+
{
114+
string taxonomyUid = _fixture.Create<string>();
115+
Term terms = _stack.Taxonomy(taxonomyUid).Terms();
116+
117+
Assert.IsNotNull(terms);
118+
Assert.IsNull(terms.Uid);
119+
Assert.AreEqual($"/taxonomies/{taxonomyUid}/terms", terms.resourcePath);
120+
}
121+
122+
[TestMethod]
123+
public void Should_Get_Single_Term_From_Taxonomy()
124+
{
125+
string taxonomyUid = _fixture.Create<string>();
126+
string termUid = _fixture.Create<string>();
127+
Term term = _stack.Taxonomy(taxonomyUid).Terms(termUid);
128+
129+
Assert.IsNotNull(term);
130+
Assert.AreEqual(termUid, term.Uid);
131+
Assert.AreEqual($"/taxonomies/{taxonomyUid}/terms/{termUid}", term.resourcePath);
132+
}
133+
}
134+
}

0 commit comments

Comments
 (0)