Ejemplo n.º 1
0
        public void Should_compute_md5_hash()
        {
            const string script = @"
                return md5(value);
            ";

            var vars = new ScriptVars
            {
                ["value"] = "HelloWorld"
            };

            var result = sut.Execute(vars, script).ToString();

            Assert.Equal("HelloWorld".ToMD5(), result);
        }
Ejemplo n.º 2
0
        public void Evaluate_should_return_true_when_expression_match()
        {
            const string script = @"
                value.i == 2
            ";

            var context = new ScriptVars
            {
                ["value"] = new { i = 2 }
            };

            var result = sut.Evaluate(context, script);

            Assert.True(result);
        }
        public void Should_count_characters()
        {
            const string script = @"
                return characterCount(value);
            ";

            var vars = new ScriptVars
            {
                ["value"] = "Hello, World"
            };

            var result = ((JsonNumber)sut.Execute(vars, script)).Value;

            Assert.Equal(10, result);
        }
        public void Should_slugify_value_with_single_char()
        {
            const string script = @"
                return slugify(value, true);
            ";

            var vars = new ScriptVars
            {
                ["value"] = "4 Häuser"
            };

            var result = sut.Interpolate(vars, script);

            Assert.Equal("4-hauser", result);
        }
        public void Should_convert_html_to_text()
        {
            const string script = @"
                return html2Text(value);
            ";

            var vars = new ScriptVars
            {
                ["value"] = "<script>Invalid</script><STYLE>Invalid</STYLE><p>Hello World</p>"
            };

            var result = sut.Execute(vars, script).ToString();

            Assert.Equal("Hello World", result);
        }
Ejemplo n.º 6
0
        public void Evaluate_should_return_true_when_status_match()
        {
            const string script = @"
                value.status == 'Published'
            ";

            var context = new ScriptVars
            {
                ["value"] = new { status = Status.Published }
            };

            var result = ((IScriptEngine)sut).Evaluate(context, script);

            Assert.True(result);
        }
Ejemplo n.º 7
0
        public void Evaluate_should_return_false_when_script_is_invalid()
        {
            const string script = @"
                function();
            ";

            var context = new ScriptVars
            {
                ["value"] = new { i = 2 }
            };

            var result = ((IScriptEngine)sut).Evaluate(context, script);

            Assert.False(result);
        }
Ejemplo n.º 8
0
        public void Evaluate_should_return_true_if_expression_match()
        {
            var vars = new ScriptVars
            {
                ["value"] = new { i = 2 }
            };

            const string script = @"
                value.i == 2
            ";

            var result = ((IScriptEngine)sut).Evaluate(vars, script);

            Assert.True(result);
        }
Ejemplo n.º 9
0
        public async Task ExecuteAndTransformAsync_should_return_original_content_when_not_replaced()
        {
            var content = new NamedContentData();
            var context = new ScriptVars {
                Data = content
            };

            const string script = @"
                var x = 0;
            ";

            var result = await sut.ExecuteAndTransformAsync(context, script);

            Assert.Empty(result);
        }
Ejemplo n.º 10
0
        public async Task TransformAsync_should_return_original_content_if_not_replaced()
        {
            var vars = new ScriptVars
            {
                ["data"] = new ContentData()
            };

            const string script = @"
                var x = 0;
            ";

            var result = await sut.TransformAsync(vars, script, contentOptions);

            Assert.Empty(result);
        }
Ejemplo n.º 11
0
        public async Task TransformAsync_should_return_original_content_when_script_failed()
        {
            var content = new ContentData();
            var context = new ScriptVars {
                Data = content
            };

            const string script = @"
                x => x
            ";

            var result = await sut.TransformAsync(context, script, contentOptions);

            Assert.Empty(result);
        }
Ejemplo n.º 12
0
        public void Evaluate_should_return_false_when_expression_match()
        {
            const string script = @"
                value.i == 3
            ";

            var context = new ScriptVars
            {
                ["value"] = new { i = 2 }
            };

            var result = ((IScriptEngine)sut).Evaluate(context, script);

            Assert.False(result);
        }
        public void Should_camel_case_value()
        {
            const string script = @"
                return toCamelCase(value);
            ";

            var vars = new ScriptVars
            {
                ["value"] = "Hello World"
            };

            var result = sut.Execute(vars, script).ToString();

            Assert.Equal("helloWorld", result);
        }
        public void Should_slugify_value()
        {
            const string script = @"
                return slugify(value);
            ";

            var vars = new ScriptVars
            {
                ["value"] = "4 Häuser"
            };

            var result = sut.Execute(vars, script).ToString();

            Assert.Equal("4-haeuser", result);
        }
        public void Should_pascal_case_value()
        {
            const string script = @"
                return toPascalCase(value);
            ";

            var vars = new ScriptVars
            {
                ["value"] = "Hello World"
            };

            var result = sut.Interpolate(vars, script);

            Assert.Equal("HelloWorld", result);
        }
        public void Should_convert_markdown_to_text()
        {
            const string script = @"
                return markdown2Text(value);
            ";

            var vars = new ScriptVars
            {
                ["value"] = "## Hello World"
            };

            var result = sut.Execute(vars, script).ToString();

            Assert.Equal("Hello World", result);
        }
Ejemplo n.º 17
0
        private async Task TransformAsync(ScriptVars rootVars, string script, ContentEntity content,
                                          CancellationToken ct)
        {
            var vars = new ScriptVars(rootVars)
            {
                [ScriptKeys.ContentId] = content.Id,
                [ScriptKeys.Data]      = content.Data,
            };

            var options = new ScriptOptions
            {
                AsContext = true
            };

            content.Data = await scriptEngine.TransformAsync(vars, script, options, ct);
        }
Ejemplo n.º 18
0
        public bool Trigger(EnrichedEvent @event, RuleContext context)
        {
            var trigger = (SchemaChangedTrigger)context.Rule.Trigger;

            if (string.IsNullOrWhiteSpace(trigger.Condition))
            {
                return(true);
            }

            var vars = new ScriptVars
            {
                ["event"] = @event
            };

            return(scriptEngine.Evaluate(vars, trigger.Condition));
        }
        public async Task Should_throw_validation_exception_when_calling_reject()
        {
            const string script = @"
                reject()
            ";

            var options = new ScriptOptions
            {
                CanReject = true
            };

            var vars = new ScriptVars();

            var ex = await Assert.ThrowsAsync <ValidationException>(() => sut.ExecuteAsync(vars, script, options));

            Assert.NotEmpty(ex.Errors);
        }
        public async Task Should_throw_security_exception_when_calling_reject_with_message()
        {
            const string script = @"
                disallow('Operation not allowed')
            ";

            var options = new ScriptOptions
            {
                CanDisallow = true
            };

            var vars = new ScriptVars();

            var ex = await Assert.ThrowsAsync <DomainForbiddenException>(() => sut.ExecuteAsync(vars, script, options));

            Assert.Equal("Operation not allowed", ex.Message);
        }
Ejemplo n.º 21
0
        public void Should_handle_domain_id_as_string()
        {
            var id = DomainId.NewGuid();

            var vars = new ScriptVars
            {
                ["value"] = id
            };

            const string script = @"
                return value;
            ";

            var result = sut.Execute(vars, script);

            Assert.Equal(id.ToString(), result.ToString());
        }
Ejemplo n.º 22
0
        public async Task Should_throw_security_exception_if_calling_reject()
        {
            const string script = @"
                disallow()
            ";

            var options = new ScriptOptions
            {
                CanDisallow = true
            };

            var vars = new ScriptVars();

            var ex = await Assert.ThrowsAsync <DomainForbiddenException>(() => sut.ExecuteAsync(vars, script, options));

            Assert.Equal("Script has forbidden the operation.", ex.Message);
        }
        public async Task Should_throw_validation_exception_when_calling_reject_with_message()
        {
            const string script = @"
                reject('Not valid')
            ";

            var options = new ScriptOptions
            {
                CanReject = true
            };

            var vars = new ScriptVars();

            var ex = await Assert.ThrowsAsync <ValidationException>(() => sut.ExecuteAsync(vars, script, options));

            Assert.Equal("Not valid", ex.Errors.Single().Message);
        }
Ejemplo n.º 24
0
        public async ValueTask <string?> FormatAsync(string text, EnrichedEvent @event)
        {
            if (string.IsNullOrWhiteSpace(text))
            {
                return(text);
            }

            if (TryGetTemplate(text.Trim(), out var template))
            {
                var vars = new TemplateVars
                {
                    ["event"] = @event
                };

                return(await templateEngine.RenderAsync(template, vars));
            }

            if (TryGetScript(text.Trim(), out var script))
            {
                var vars = new ScriptVars
                {
                    ["event"] = @event
                };

#pragma warning disable MA0042 // Do not use blocking calls in an async method
                var result = scriptEngine.Execute(vars, script).ToString();
#pragma warning restore MA0042 // Do not use blocking calls in an async method

                if (result == "undefined")
                {
                    return(GlobalFallback);
                }

                return(result);
            }

            var parts = BuildParts(text, @event);

            if (parts.Any(x => !x.Var.IsCompleted))
            {
                await ValueTaskEx.WhenAll(parts.Select(x => x.Var));
            }

            return(CombineParts(text, parts));
        }
Ejemplo n.º 25
0
        private async Task TransformAsync(Context context, string script, ContentEntity content)
        {
            var vars = new ScriptVars
            {
                ContentId = content.Id,
                Data      = content.Data,
                AppId     = context.App.Id,
                AppName   = context.App.Name,
                User      = context.User
            };

            var options = new ScriptOptions
            {
                AsContext = true
            };

            content.Data = await scriptEngine.TransformAsync(vars, script, options);
        }
Ejemplo n.º 26
0
        public async Task EnrichAsync(Context context, IEnumerable <ContentEntity> contents, ProvideSchema schemas,
                                      CancellationToken ct)
        {
            if (!ShouldEnrich(context))
            {
                return;
            }

            foreach (var group in contents.GroupBy(x => x.SchemaId.Id))
            {
                var(schema, _) = await schemas(group.Key);

                var script = schema.SchemaDef.Scripts.Query;

                if (string.IsNullOrWhiteSpace(script))
                {
                    continue;
                }

                var vars = new ScriptVars
                {
                    [ScriptKeys.AppId]   = context.App.Id,
                    [ScriptKeys.AppName] = context.App.Name,
                    [ScriptKeys.User]    = context.User
                };

                var preScript = schema.SchemaDef.Scripts.QueryPre;

                if (!string.IsNullOrWhiteSpace(preScript))
                {
                    var options = new ScriptOptions
                    {
                        AsContext = true
                    };

                    await scriptEngine.ExecuteAsync(vars, preScript, options, ct);
                }

                await AsyncHelper.WhenAllThrottledAsync(group, async (content, _) =>
                {
                    await TransformAsync(vars, script, content, ct);
                }, ct : ct);
            }
        }
Ejemplo n.º 27
0
        public async Task Should_resolve_references()
        {
            var referenceId1 = DomainId.NewGuid();
            var reference1 = CreateReference(referenceId1, 1);
            var referenceId2 = DomainId.NewGuid();
            var reference2 = CreateReference(referenceId1, 2);

            var user = new ClaimsPrincipal();

            var data =
                new ContentData()
                    .AddField("references",
                        new ContentFieldData()
                            .AddInvariant(JsonValue.Array(referenceId1, referenceId2)));

            A.CallTo(() => contentQuery.QueryAsync(
                    A<Context>.That.Matches(x => x.App.Id == appId.Id && x.User == user), A<Q>.That.HasIds(referenceId1, referenceId2), A<CancellationToken>._))
                .Returns(ResultList.CreateFrom(2, reference1, reference2));

            var vars = new ScriptVars
            {
                ["appId"] = appId.Id,
                ["data"] = data,
                ["dataOld"] = null,
                ["user"] = user
            };

            var expected = @"
                Text: Hello 1 World 1
                Text: Hello 2 World 2
            ";

            var script = @"
                getReferences(data.references.iv, function (references) {
                    var result1 = `Text: ${references[0].data.field1.iv} ${references[0].data.field2.iv}`;
                    var result2 = `Text: ${references[1].data.field1.iv} ${references[1].data.field2.iv}`;

                    complete(`${result1}\n${result2}`);
                })";

            var result = (await sut.ExecuteAsync(vars, script)).ToString();

            Assert.Equal(Cleanup(expected), Cleanup(result));
        }
Ejemplo n.º 28
0
        private async Task TransformAsync(Context context, string script, ContentEntity content,
                                          CancellationToken ct)
        {
            var vars = new ScriptVars
            {
                [ScriptKeys.AppId]     = context.App.Id,
                [ScriptKeys.AppName]   = context.App.Name,
                [ScriptKeys.ContentId] = content.Id,
                [ScriptKeys.Data]      = content.Data,
                [ScriptKeys.User]      = context.User
            };

            var options = new ScriptOptions
            {
                AsContext = true
            };

            content.Data = await scriptEngine.TransformAsync(vars, script, options, ct);
        }
Ejemplo n.º 29
0
        public async Task TransformAsync_should_timeout_if_replace_never_called()
        {
            var content = new ContentData();
            var context = new ScriptVars {
                Data = content, Operation = "MyOperation"
            };

            const string script = @"
                async = true;

                var data = ctx.data;

                getJSON('http://squidex.io', function(result) {
                    data.operation = { iv: result.key };
                });
            ";

            await Assert.ThrowsAnyAsync <OperationCanceledException>(() => sut.TransformAsync(context, script, contentOptions));
        }
Ejemplo n.º 30
0
        public async Task TransformAsync_should_transform_content_with_old_content()
        {
            var content =
                new ContentData()
                .AddField("number0",
                          new ContentFieldData()
                          .AddInvariant(3.0));

            var oldContent =
                new ContentData()
                .AddField("number0",
                          new ContentFieldData()
                          .AddInvariant(5.0));

            var expected =
                new ContentData()
                .AddField("number0",
                          new ContentFieldData()
                          .AddInvariant(13.0));

            var userIdentity  = new ClaimsIdentity();
            var userPrincipal = new ClaimsPrincipal(userIdentity);

            userIdentity.AddClaim(new Claim(OpenIdClaims.ClientId, "2"));

            var vars = new ScriptVars
            {
                ["data"]    = content,
                ["dataOld"] = oldContent,
                ["user"]    = userPrincipal
            };

            const string script = @"
                ctx.data.number0.iv = ctx.data.number0.iv + ctx.dataOld.number0.iv * parseInt(ctx.user.id, 10);

                replace(ctx.data);
            ";

            var result = await sut.TransformAsync(vars, script, contentOptions);

            Assert.Equal(expected, result);
        }