From ec7910bf135dbef02cb58999ab09c59fea9867ec Mon Sep 17 00:00:00 2001 From: VladimirOplustil Date: Thu, 17 Aug 2023 08:40:30 +0200 Subject: [PATCH] Add asset codename --- .../Data/Asset/Asset.json | 1 + .../Data/Asset/AssetsPage1.json | 1 + .../Data/Asset/AssetsPage2.json | 1 + .../Data/Asset/AssetsPage3.json | 1 + .../AssetRenditionTests.cs | 45 ++++++++++++--- .../ManagementClientTests/AssetTests.cs | 56 +++++++++++++------ .../Modules/UrlBuilder/AssetRenditionTests.cs | 10 +++- .../Modules/UrlBuilder/AssetTests.cs | 8 ++- .../Models/Assets/AssetCreateModel.cs | 6 ++ .../Models/Assets/AssetModel.cs | 6 ++ .../Models/Assets/AssetUpsertModel.cs | 6 ++ .../Models/StronglyTyped/AssetCreateModel.cs | 6 ++ .../Models/StronglyTyped/AssetModel.cs | 6 ++ .../Models/StronglyTyped/AssetUpsertModel.cs | 6 ++ .../Modules/ModelBuilders/ModelProvider.cs | 3 + .../UrlBuilder/Templates/AssetTemplate.cs | 6 +- 16 files changed, 135 insertions(+), 33 deletions(-) diff --git a/Kontent.Ai.Management.Tests/Data/Asset/Asset.json b/Kontent.Ai.Management.Tests/Data/Asset/Asset.json index 43c63ec4..c87e1e5e 100644 --- a/Kontent.Ai.Management.Tests/Data/Asset/Asset.json +++ b/Kontent.Ai.Management.Tests/Data/Asset/Asset.json @@ -1,5 +1,6 @@ { "id": "01647205-c8c4-4b41-b524-1a98a7b12750", + "codename": "my_super_asset", "external_id": "asset-1", "file_name": "our-story.jpg", "title": "My super asset", diff --git a/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage1.json b/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage1.json index 33adf08a..2a65546c 100644 --- a/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage1.json +++ b/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage1.json @@ -2,6 +2,7 @@ "assets": [ { "id": "00000000-0000-0000-0000-000000000000", + "codename": "my_super_asset", "external_id": "asset-1", "file_name": "our-story.jpg", "title": "My super asset", diff --git a/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage2.json b/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage2.json index 7badb83b..5bff4d51 100644 --- a/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage2.json +++ b/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage2.json @@ -2,6 +2,7 @@ "assets": [ { "id": "10000000-0000-0000-0000-000000000000", + "codename": "my_super_asset", "external_id": "asset-1", "file_name": "our-story.jpg", "title": "My super asset", diff --git a/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage3.json b/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage3.json index 159c47a6..6f7f118f 100644 --- a/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage3.json +++ b/Kontent.Ai.Management.Tests/Data/Asset/AssetsPage3.json @@ -2,6 +2,7 @@ "assets": [ { "id": "20000000-0000-0000-0000-000000000000", + "codename": "my_super_asset", "external_id": "asset-1", "file_name": "our-story.jpg", "title": "My super asset", diff --git a/Kontent.Ai.Management.Tests/ManagementClientTests/AssetRenditionTests.cs b/Kontent.Ai.Management.Tests/ManagementClientTests/AssetRenditionTests.cs index a418c970..2d24776e 100644 --- a/Kontent.Ai.Management.Tests/ManagementClientTests/AssetRenditionTests.cs +++ b/Kontent.Ai.Management.Tests/ManagementClientTests/AssetRenditionTests.cs @@ -41,11 +41,21 @@ public async Task ListAssetRenditionsAsync_ById_ReturnsRenditions() } [Fact] - public async Task ListAssetRenditionsAsync_ByCodename_Throws() + public async Task ListAssetRenditionsAsync_ByCodename_ReturnsRenditions() { - var client = _scenario.CreateManagementClient(); + var client = _scenario + .WithResponses("AssetRenditionPage1.json", "AssetRenditionPage2.json", "AssetRenditionPage3.json") + .CreateManagementClient(); - await client.Invoking(x => x.ListAssetRenditionsAsync(Reference.ByCodename("codename"))).Should().ThrowAsync(); + var identifier = Reference.ByCodename("codename"); + var response = await client.ListAssetRenditionsAsync(identifier).GetAllAsync(); + + _scenario + .CreateExpectations() + .HttpMethod(HttpMethod.Get) + .ListingResponse(response) + .Url($"{Endpoint}/projects/{PROJECT_ID}/assets/codename/{identifier.Codename}/renditions") + .Validate(); } [Fact] @@ -143,16 +153,36 @@ public async Task CreateAssetRenditionAsync_ById_CreatesRenditions() } [Fact] - public async Task CreateAssetRenditionAsync_ByCodename_Throws() + public async Task CreateAssetRenditionAsync_ByCodename_CreatesRenditions() { var client = _scenario .WithResponses("AssetRendition.json") .CreateManagementClient(); + var createModel = new AssetRenditionCreateModel + { + ExternalId = "rendition-1", + Transformation = new RectangleResizeTransformation + { + CustomWidth = 120, + CustomHeight = 240, + X = 300, + Y = 200, + Width = 360, + Height = 720, + } + }; + var identifier = Reference.ByCodename("codename"); - var createRenditionModel = new AssetRenditionCreateModel(); + var response = await client.CreateAssetRenditionAsync(identifier, createModel); - await client.Invoking(x => x.CreateAssetRenditionAsync(identifier, createRenditionModel)).Should().ThrowAsync(); + _scenario + .CreateExpectations() + .HttpMethod(HttpMethod.Post) + .RequestPayload(createModel) + .Response(response) + .Url($"{Endpoint}/projects/{PROJECT_ID}/assets/codename/{identifier.Codename}/renditions") + .Validate(); } [Fact] @@ -284,7 +314,7 @@ public IEnumerator GetEnumerator() public IEnumerable<(AssetRenditionIdentifier Identifier, string Url)> GetPermutation() { - var assetIdentifier = new[] { ById, ByExternalId }; + var assetIdentifier = new[] { ById, ByCodename, ByExternalId }; var renditionIdentifiers = new[] { ById, ByExternalId }; foreach (var item in assetIdentifier) @@ -299,6 +329,7 @@ public IEnumerator GetEnumerator() } private static (Reference Identifier, string UrlSegment) ById => (Reference.ById(Guid.Parse("4b628214-e4fe-4fe0-b1ff-955df33e1515")), "4b628214-e4fe-4fe0-b1ff-955df33e1515"); + private static (Reference Identifier, string UrlSegment) ByCodename => (Reference.ByCodename("codename"), "codename/codename"); private static (Reference Identifier, string UrlSegment) ByExternalId => (Reference.ByExternalId("external-id"), "external-id/external-id"); } } diff --git a/Kontent.Ai.Management.Tests/ManagementClientTests/AssetTests.cs b/Kontent.Ai.Management.Tests/ManagementClientTests/AssetTests.cs index c63c4608..49b536c8 100644 --- a/Kontent.Ai.Management.Tests/ManagementClientTests/AssetTests.cs +++ b/Kontent.Ai.Management.Tests/ManagementClientTests/AssetTests.cs @@ -69,12 +69,15 @@ public async Task GetAssetAsync_StronglyTyped_ById_GetsAsset() } [Fact] - public async Task GetAssetAsync_StronglyTyped_ByCodename_Throws() + public async Task GetAssetAsync_StronglyTyped_ByCodename_GetsAsset() { - var client = _fileSystemFixture.CreateMockClientWithoutResponse(); + var client = _fileSystemFixture.CreateMockClientWithResponse("Asset.json"); + + var expected = GetExpectedStronglyTypedAssetModel(); + + var response = await client.GetAssetAsync(Reference.ByCodename(expected.Codename)); - await client.Invoking(c => c.GetAssetAsync(Reference.ByCodename("codename"))) - .Should().ThrowExactlyAsync(); + response.Should().BeEquivalentTo(expected); } [Fact] @@ -111,12 +114,15 @@ public async Task GetAssetAsync_DynamicallyTyped_ById_GetsAsset() } [Fact] - public async Task GetAssetAsync_DynamicallyTyped_ByCodename_Throws() + public async Task GetAssetAsync_DynamicallyTyped_ByCodename_GetsAsset() { - var client = _fileSystemFixture.CreateMockClientWithoutResponse(); + var client = _fileSystemFixture.CreateMockClientWithResponse("Asset.json"); + + var expected = GetExpectedDynamicAssetModel(); - await client.Invoking(c => c.GetAssetAsync(Reference.ByCodename("codename"))) - .Should().ThrowExactlyAsync(); + var response = await client.GetAssetAsync(Reference.ByCodename(expected.Codename)); + + response.Should().BeEquivalentTo(expected); } [Fact] @@ -315,12 +321,19 @@ public async Task UpsertAssetAsync_StronglyTyped_ById_UpsertsAsset() [Fact] public async Task UpsertAssetAsync_StronglyTyped_ByCodename_UpsertsAsset() { - var client = _fileSystemFixture.CreateMockClientWithoutResponse(); + var client = _fileSystemFixture.CreateMockClientWithResponse("Asset.json"); - var updateModel = new AssetUpsertModel { Title = "xxx" }; + var expected = GetExpectedStronglyTypedAssetModel(); - await client.Invoking(c => c.UpsertAssetAsync(Reference.ByCodename("c"), updateModel)) - .Should().ThrowExactlyAsync(); + var updateModel = new AssetUpsertModel + { + Title = expected.Title, + Elements = expected.Elements + }; + + var response = await client.UpsertAssetAsync(Reference.ByCodename(expected.Codename), updateModel); + + response.Should().BeEquivalentTo(expected); } [Fact] @@ -385,12 +398,19 @@ public async Task UpsertAssetAsync_DynamicallyTyped_ById_UpsertsAsset() [Fact] public async Task UpsertAssetAsync_DynamicallyTyped_ByCodename_UpsertsAsset() { - var client = _fileSystemFixture.CreateMockClientWithoutResponse(); + var client = _fileSystemFixture.CreateMockClientWithResponse("Asset.json"); - var updateModel = new AssetUpsertModel { Title = "xxx" }; + var expected = GetExpectedDynamicAssetModel(); - await client.Invoking(c => c.UpsertAssetAsync(Reference.ByCodename("c"), updateModel)) - .Should().ThrowExactlyAsync(); + var updateModel = new AssetUpsertModel + { + Title = expected.Title, + Elements = expected.Elements + }; + + var response = await client.UpsertAssetAsync(Reference.ByCodename(expected.Codename), updateModel); + + response.Should().BeEquivalentTo(expected); } [Fact] @@ -580,7 +600,7 @@ public async Task DeleteAssetAsync_ByCodename_DeletesAsset() var client = _fileSystemFixture.CreateMockClientWithoutResponse(); await client.Invoking(c => c.DeleteAssetAsync(Reference.ByCodename("c"))) - .Should().ThrowExactlyAsync(); + .Should().NotThrowAsync(); } [Fact] @@ -634,6 +654,7 @@ private static AssetModel GetExpectedDynamicAssetModel(string assetId = "0164720 return new AssetModel { Id = stronglyTyped.Id, + Codename = stronglyTyped.Codename, ExternalId = stronglyTyped.ExternalId, FileName = stronglyTyped.FileName, Title = stronglyTyped.Title, @@ -653,6 +674,7 @@ private static AssetModel GetExpectedDynamicAssetModel(string assetId = "0164720 private static AssetModel GetExpectedStronglyTypedAssetModel(string assetId = "01647205-c8c4-4b41-b524-1a98a7b12750") => new() { Id = Guid.Parse(assetId), + Codename = "my_super_asset", ExternalId = "asset-1", FileName = "our-story.jpg", Title = "My super asset", diff --git a/Kontent.Ai.Management.Tests/Modules/UrlBuilder/AssetRenditionTests.cs b/Kontent.Ai.Management.Tests/Modules/UrlBuilder/AssetRenditionTests.cs index 775c009f..8311cb57 100644 --- a/Kontent.Ai.Management.Tests/Modules/UrlBuilder/AssetRenditionTests.cs +++ b/Kontent.Ai.Management.Tests/Modules/UrlBuilder/AssetRenditionTests.cs @@ -73,10 +73,14 @@ public void BuildAssetRenditionsUrlFromAssetExternalIdAndRenditionExternalId_Wit } [Fact] - public void BuildAssetRenditionsUrlFromAssetCodenameAndRenditionId_AssetDoesNotSupportCodename_Throws() + public void BuildAssetRenditionsUrlFromAssetCodenameAndRenditionId_WithGivenAssetAndRenditionIds_ReturnsExpectedUrl() { - _builder.Invoking(x => x.BuildAssetRenditionsUrl(new AssetRenditionIdentifier(Reference.ByCodename("not-supported"), Reference.ById(Guid.NewGuid())))) - .Should().ThrowExactly(); + var assetCodename = "which_brewing_fits_you"; + var renditionId = Guid.NewGuid(); + var expectedResult = $"{ENDPOINT}/projects/{PROJECT_ID}/assets/codename/{assetCodename}/renditions/{renditionId}"; + var actualResult = _builder.BuildAssetRenditionsUrl(new AssetRenditionIdentifier(Reference.ByCodename(assetCodename), Reference.ById(renditionId))); + + Assert.Equal(expectedResult, actualResult); } [Fact] diff --git a/Kontent.Ai.Management.Tests/Modules/UrlBuilder/AssetTests.cs b/Kontent.Ai.Management.Tests/Modules/UrlBuilder/AssetTests.cs index b546b75c..36373187 100644 --- a/Kontent.Ai.Management.Tests/Modules/UrlBuilder/AssetTests.cs +++ b/Kontent.Ai.Management.Tests/Modules/UrlBuilder/AssetTests.cs @@ -18,9 +18,13 @@ public void BuildAssetsUrlFromId_ById_ReturnsExpectedUrl() } [Fact] - public void BuildAssetsUrlFromExternalId_ByCodename_ReturnsExpectedUrl() + public void BuildAssetsUrlFromCodename_ByCodename_ReturnsExpectedUrl() { - _builder.Invoking(c => c.BuildAssetsUrl(Reference.ByCodename("c"))).Should().Throw(); + var codename = "which_brewing_fits_you"; + var expectedResult = $"{ENDPOINT}/projects/{PROJECT_ID}/assets/codename/{codename}"; + var actualResult = _builder.BuildAssetsUrl(Reference.ByCodename(codename)); + + Assert.Equal(expectedResult, actualResult); } [Fact] diff --git a/Kontent.Ai.Management/Models/Assets/AssetCreateModel.cs b/Kontent.Ai.Management/Models/Assets/AssetCreateModel.cs index 5e3a1f32..fc4cbe4c 100644 --- a/Kontent.Ai.Management/Models/Assets/AssetCreateModel.cs +++ b/Kontent.Ai.Management/Models/Assets/AssetCreateModel.cs @@ -51,4 +51,10 @@ public sealed class AssetCreateModel /// [JsonProperty("elements")] public IEnumerable Elements { get; set; } + + /// + /// Gets or sets the codename of the asset. + /// + [JsonProperty("codename")] + public string Codename { set; get; } } diff --git a/Kontent.Ai.Management/Models/Assets/AssetModel.cs b/Kontent.Ai.Management/Models/Assets/AssetModel.cs index d0efe1ea..cdb2b8f9 100644 --- a/Kontent.Ai.Management/Models/Assets/AssetModel.cs +++ b/Kontent.Ai.Management/Models/Assets/AssetModel.cs @@ -16,6 +16,12 @@ public sealed class AssetModel [JsonProperty("id")] public Guid Id { get; set; } + /// + /// Gets or sets the codename of the asset. + /// + [JsonProperty("codename")] + public string Codename { set; get; } + /// /// Gets or sets the file name of the asset. /// diff --git a/Kontent.Ai.Management/Models/Assets/AssetUpsertModel.cs b/Kontent.Ai.Management/Models/Assets/AssetUpsertModel.cs index 15e6290f..8cd35eb6 100644 --- a/Kontent.Ai.Management/Models/Assets/AssetUpsertModel.cs +++ b/Kontent.Ai.Management/Models/Assets/AssetUpsertModel.cs @@ -44,4 +44,10 @@ public sealed class AssetUpsertModel /// [JsonProperty("file_reference")] public FileReference FileReference { get; set; } + + /// + /// Gets or sets the codename of the asset. + /// + [JsonProperty("codename")] + public string Codename { set; get; } } diff --git a/Kontent.Ai.Management/Models/StronglyTyped/AssetCreateModel.cs b/Kontent.Ai.Management/Models/StronglyTyped/AssetCreateModel.cs index facc8f5f..a62d26ca 100644 --- a/Kontent.Ai.Management/Models/StronglyTyped/AssetCreateModel.cs +++ b/Kontent.Ai.Management/Models/StronglyTyped/AssetCreateModel.cs @@ -17,6 +17,12 @@ namespace Kontent.Ai.Management.Models.StronglyTyped; [JsonProperty("file_reference")] public FileReference FileReference { get; set; } + /// + /// Gets or sets the codename of the asset. + /// + [JsonProperty("codename")] + public string Codename { set; get; } + /// /// Gets or sets the description for the asset. /// diff --git a/Kontent.Ai.Management/Models/StronglyTyped/AssetModel.cs b/Kontent.Ai.Management/Models/StronglyTyped/AssetModel.cs index 68b35886..b92f6401 100644 --- a/Kontent.Ai.Management/Models/StronglyTyped/AssetModel.cs +++ b/Kontent.Ai.Management/Models/StronglyTyped/AssetModel.cs @@ -17,6 +17,12 @@ namespace Kontent.Ai.Management.Models.StronglyTyped; [JsonProperty("id")] public Guid Id { get; set; } + /// + /// Gets or sets the codename of the asset. + /// + [JsonProperty("codename")] + public string Codename { set; get; } + /// /// Gets or sets the file name of the asset. /// diff --git a/Kontent.Ai.Management/Models/StronglyTyped/AssetUpsertModel.cs b/Kontent.Ai.Management/Models/StronglyTyped/AssetUpsertModel.cs index 84528a41..ae7ce56a 100644 --- a/Kontent.Ai.Management/Models/StronglyTyped/AssetUpsertModel.cs +++ b/Kontent.Ai.Management/Models/StronglyTyped/AssetUpsertModel.cs @@ -16,6 +16,12 @@ namespace Kontent.Ai.Management.Models.StronglyTyped; /// [JsonProperty("file_reference", Required = Required.Always)] public FileReference FileReference { get; set; } + + /// + /// Gets or sets the codename of the asset. + /// + [JsonProperty("codename")] + public string Codename { set; get; } /// /// Gets or sets the description for the asset. diff --git a/Kontent.Ai.Management/Modules/ModelBuilders/ModelProvider.cs b/Kontent.Ai.Management/Modules/ModelBuilders/ModelProvider.cs index 2588e2f4..bdc05050 100644 --- a/Kontent.Ai.Management/Modules/ModelBuilders/ModelProvider.cs +++ b/Kontent.Ai.Management/Modules/ModelBuilders/ModelProvider.cs @@ -42,6 +42,7 @@ internal ModelProvider() FileReference = asset.FileReference, Descriptions = asset.Descriptions, Title = asset.Title, + Codename = asset.Codename, ExternalId = asset.ExternalId, LastModified = asset.LastModified, ImageHeight = asset.ImageHeight, @@ -58,6 +59,7 @@ internal ModelProvider() Descriptions = asset.Descriptions, Title = asset.Title, Folder = asset.Folder, + Codename = asset.Codename, ExternalId = asset.ExternalId, Collection = asset.Collection, Elements = _elementModelProvider.GetDynamicElements(asset.Elements), @@ -70,6 +72,7 @@ internal ModelProvider() Descriptions = asset.Descriptions, Title = asset.Title, Folder = asset.Folder, + Codename = asset.Codename, Collection = asset.Collection, Elements = _elementModelProvider.GetDynamicElements(asset.Elements), }; diff --git a/Kontent.Ai.Management/Modules/UrlBuilder/Templates/AssetTemplate.cs b/Kontent.Ai.Management/Modules/UrlBuilder/Templates/AssetTemplate.cs index 165682bb..f426f7c8 100644 --- a/Kontent.Ai.Management/Modules/UrlBuilder/Templates/AssetTemplate.cs +++ b/Kontent.Ai.Management/Modules/UrlBuilder/Templates/AssetTemplate.cs @@ -1,6 +1,4 @@ -using System; - -namespace Kontent.Ai.Management.Modules.UrlBuilder.Templates; +namespace Kontent.Ai.Management.Modules.UrlBuilder.Templates; internal class AssetTemplate : UrlTemplate { @@ -8,7 +6,7 @@ internal class AssetTemplate : UrlTemplate public override string UrlId => "/assets/{0}"; - public override string UrlCodename => throw new InvalidOperationException("assets do not have codename url"); + public override string UrlCodename => "/assets/codename/{0}"; public override string UrlExternalId => "/assets/external-id/{0}"; }