// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Squidex.Domain.Apps.Core.Assets; using Squidex.Domain.Apps.Core.Scripting; using Squidex.Domain.Apps.Entities.Assets.Commands; using Squidex.Domain.Apps.Entities.TestHelpers; using Squidex.Infrastructure; using Squidex.Infrastructure.Json.Objects; using Squidex.Infrastructure.Validation; namespace Squidex.Domain.Apps.Entities.Assets.DomainObject.Guards; public sealed class ScriptingExtensionsTests : GivenContext { [Fact] public async Task Should_add_tag_in_script() { var script = "ctx.command.tags.add('tag');"; var command = new AnnotateAsset { Tags = new HashSet() }; var operation = Operation(script, CreateAsset(), command); await operation.ExecuteAnnotateScriptAsync(command, CancellationToken); Assert.Contains("tag", command.Tags); } [Fact] public async Task Should_add_metadata_in_script() { var script = "ctx.command.metadata['foo'] = 42;"; var command = new AnnotateAsset { Metadata = new AssetMetadata() }; var operation = Operation(script, CreateAsset(), command); await operation.ExecuteAnnotateScriptAsync(command, CancellationToken); Assert.Equal(JsonValue.Create(42), command.Metadata["foo"]); } [Fact] public async Task Should_not_allow_to_write_asset_tags() { var script = "ctx.asset.tags.add('tag');"; var command = new AnnotateAsset(); var operation = Operation(script, CreateAsset(), command); await Assert.ThrowsAsync(() => operation.ExecuteAnnotateScriptAsync(command, CancellationToken)); } [Fact] public async Task Should_not_allow_to_write_asset_metadata() { var script = "ctx.asset.metadata['foo'] = 42;"; var command = new AnnotateAsset(); var operation = Operation(script, CreateAsset(), command); await Assert.ThrowsAsync(() => operation.ExecuteAnnotateScriptAsync(command, CancellationToken)); } private AssetOperation Operation(string script, AssetEntity asset, AnnotateAsset command) { var scripts = new AssetScripts { Annotate = script }; A.CallTo(() => App.AssetScripts) .Returns(scripts); var serviceProvider = new ServiceCollection() .AddMemoryCache() .AddOptions() .AddOptions().Services .AddSingleton() .BuildServiceProvider(); command.Actor = User; command.User = Mocks.FrontendUser(); return new AssetOperation(serviceProvider, () => asset) { App = App, CommandId = asset.Id, Command = command }; } private AssetEntity CreateAsset() { return new AssetEntity { Id = DomainId.NewGuid(), AppId = AppId, Created = default, CreatedBy = User, Metadata = new AssetMetadata(), Tags = new HashSet() }; } }