| /* |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| package metadata |
| |
| import ( |
| "testing" |
| |
| "github.com/stretchr/testify/assert" |
| |
| v1 "github.com/apache/camel-k/pkg/apis/camel/v1" |
| "github.com/apache/camel-k/pkg/util/camel" |
| ) |
| |
| func TestDependenciesJavaSource(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.java", |
| Content: ` |
| import org.apache.camel.component.activemq.ActiveMQComponent; |
| |
| from("telegram:bots/cippa").to("log:stash"); |
| from("timer:tick").to("amqp:queue"); |
| from("ine:xistent").to("amqp:queue"); |
| from("twitter-search:{{twitterKeywords}}" |
| + "?delay={{twitterDelayMs}}"); |
| `, |
| }, |
| Language: v1.LanguageJavaSource, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:activemq", |
| "camel-quarkus:amqp", |
| "camel-quarkus:log", |
| "camel-quarkus:telegram", |
| "camel-quarkus:timer", |
| "camel-quarkus:twitter", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestDependenciesJavaScript(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "source.js", |
| Content: ` |
| var component = Java.type("org.apache.camel.component.activemq.ActiveMQComponent"); |
| |
| from('telegram:bots/cippa').to("log:stash"); |
| from('timer:tick').to("amqp:queue"); |
| from("ine:xistent").to("amqp:queue"); |
| '"' |
| `, |
| }, |
| Language: v1.LanguageJavaScript, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:activemq", |
| "camel-quarkus:amqp", |
| "camel-quarkus:log", |
| "camel-quarkus:telegram", |
| "camel-quarkus:timer", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestDependenciesGroovy(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "source.groovy", |
| Content: ` |
| import org.apache.camel.component.activemq.ActiveMQComponent; |
| |
| from('telegram:bots/cippa').to("log:stash"); |
| from('timer:tick').to("amqp:queue"); |
| from("ine:xistent").to("amqp:queue"); |
| from('twitter-search:{{twitterKeywords}}' |
| + '?delay={{twitterDelayMs}}'); |
| '" |
| `, |
| }, |
| Language: v1.LanguageGroovy, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:activemq", |
| "camel-quarkus:amqp", |
| "camel-quarkus:log", |
| "camel-quarkus:telegram", |
| "camel-quarkus:timer", |
| "camel-quarkus:twitter", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestDependencies(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.java", |
| Content: ` |
| from("http:test").to("log:end"); |
| from("https:test").to("log:end"); |
| from("twitter-timeline:test").to("mock:end"); |
| `, |
| }, |
| Language: v1.LanguageJavaSource, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch(t, |
| []string{ |
| "camel-quarkus:http", |
| "camel-quarkus:log", |
| "camel-quarkus:mock", |
| "camel-quarkus:twitter", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestDependenciesQuarkus(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.java", |
| Content: ` |
| import org.apache.camel.component.timer.TimerComponent; |
| |
| from("http:test").to("log:end"); |
| from("https:test").to("log:end"); |
| from("twitter-timeline:test").to("mock:end"); |
| from("direct:start").circuitBreaker().faultToleranceConfiguration().timeoutEnabled(true).timeoutDuration(1500).end() |
| .to("direct:other").onFallback().setBody(constant("Fallback response")).end(); |
| `, |
| }, |
| Language: v1.LanguageJavaSource, |
| } |
| |
| catalog, err := camel.QuarkusCatalog() |
| assert.Nil(t, err) |
| assert.NotNil(t, catalog) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch(t, |
| []string{ |
| "camel-quarkus:http", |
| "camel-quarkus:log", |
| "camel-quarkus:mock", |
| "camel-quarkus:timer", |
| "camel-quarkus:twitter", |
| "camel-quarkus:direct", |
| }, |
| meta.Dependencies.List()) |
| |
| assert.True(t, meta.RequiredCapabilities.Has(v1.CapabilityCircuitBreaker)) |
| } |
| |
| func TestJacksonDependency(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.java", |
| Content: ` |
| from("http:test").unmarshal().json(JsonLibrary.Jackson).to("log:end"); |
| `, |
| }, |
| Language: v1.LanguageJavaSource, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:http", |
| "camel-quarkus:jackson", |
| "camel-quarkus:log", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestJacksonImplicitDependency(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.groovy", |
| Content: ` |
| from("http:test") |
| .unmarshal().json() |
| .to("log:end") |
| `, |
| }, |
| Language: v1.LanguageGroovy, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:http", |
| "camel-quarkus:jackson", |
| "camel-quarkus:log", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestLanguageDependencies(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Languages.java", |
| Content: ` |
| from("direct:start") |
| .transform().ognl("request.body.name == 'Camel K'") |
| .transform().simple("${body.toUpperCase()}") |
| .transform().mvel("resource:classpath:script.mvel") |
| .transform().xquery("/ns:foo/bar", String.class, new Namespaces("ns", "http://foo/bar")) |
| .transform().xpath("//foo/bar") |
| .transform().jsonpath("$.foo") |
| .transform().groovy("request.body += 'modified'") |
| .split().xtokenize("/ns:foo/bar", new Namespaces("ns", "http://foo/bar")); |
| `, |
| }, |
| Language: v1.LanguageJavaSource, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:direct", |
| "camel-quarkus:mvel", |
| "camel-quarkus:ognl", |
| "camel-quarkus:xpath", |
| "camel-quarkus:jsonpath", |
| "camel-quarkus:groovy", |
| "camel-quarkus:saxon", |
| "camel-quarkus:xml-jaxp", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestLanguageDependenciesTransformExpression(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Languages.java", |
| Content: ` |
| from("direct:start") |
| .transform(language("ognl", "request.body.name == 'Camel K'")) |
| .transform(simple("${body.toUpperCase()}")) |
| .transform(xpath("//foo/bar")) |
| .transform(jsonpath("$.foo")) |
| `, |
| }, |
| Language: v1.LanguageJavaSource, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:direct", |
| "camel-quarkus:ognl", |
| "camel-quarkus:xpath", |
| "camel-quarkus:jsonpath", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestCircuitBreakerDependency(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.groovy", |
| Content: ` |
| from("http:test") |
| .circuitBreaker() |
| .to("log:end") |
| .onFallback() |
| .to("log:fallback") |
| `, |
| }, |
| Language: v1.LanguageGroovy, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch(t, |
| []string{ |
| "camel-quarkus:http", |
| "camel-quarkus:log", |
| }, |
| meta.Dependencies.List()) |
| |
| assert.True(t, meta.RequiredCapabilities.Has(v1.CapabilityCircuitBreaker)) |
| } |
| |
| func TestRestDependency(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.groovy", |
| Content: ` |
| rest() |
| .get("/api") |
| .to("direct:get") |
| from("http:test") |
| .to("log:info") |
| `, |
| }, |
| Language: v1.LanguageGroovy, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:http", |
| "camel-quarkus:direct", |
| "camel-quarkus:log", |
| "mvn:org.apache.camel.quarkus/camel-quarkus-rest", |
| "mvn:org.apache.camel.quarkus/camel-quarkus-platform-http", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestRestWithPathDependency(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.groovy", |
| Content: ` |
| rest("/test") |
| .get("/api") |
| .to("direct:get") |
| from("http:test") |
| .to("log:info") |
| `, |
| }, |
| Language: v1.LanguageGroovy, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, []string{ |
| "camel-quarkus:http", |
| "camel-quarkus:direct", |
| "camel-quarkus:log", |
| "mvn:org.apache.camel.quarkus/camel-quarkus-rest", |
| "mvn:org.apache.camel.quarkus/camel-quarkus-platform-http", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestRestConfigurationDependency(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.groovy", |
| Content: ` |
| restConfiguration() |
| .component("netty-http") |
| from("http:test") |
| .to("log:info") |
| `, |
| }, |
| Language: v1.LanguageGroovy, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, []string{ |
| "camel-quarkus:http", |
| "camel-quarkus:log", |
| "mvn:org.apache.camel.quarkus/camel-quarkus-rest", |
| "mvn:org.apache.camel.quarkus/camel-quarkus-platform-http", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestRestClosureDependencyGroovy(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.groovy", |
| Content: ` |
| rest { |
| } |
| from("http:test") |
| .to("log:info") |
| `, |
| }, |
| Language: v1.LanguageGroovy, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:http", |
| "camel-quarkus:log", |
| "mvn:org.apache.camel.quarkus/camel-quarkus-rest", |
| "mvn:org.apache.camel.quarkus/camel-quarkus-platform-http", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestRestClosureDependencyKotlin(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "Request.groovy", |
| Content: ` |
| rest { |
| } |
| from("http:test") |
| .to("log:info") |
| `, |
| }, |
| Language: v1.LanguageKotlin, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:http", |
| "camel-quarkus:log", |
| "mvn:org.apache.camel.quarkus/camel-quarkus-rest", |
| "mvn:org.apache.camel.quarkus/camel-quarkus-platform-http", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| func TestXMLCircuitBreakerDependency(t *testing.T) { |
| code := v1.SourceSpec{ |
| |
| DataSpec: v1.DataSpec{ |
| Name: "routes.xml", |
| Content: ` |
| <from uri="direct:ciao" /> |
| <circuitBreaker> |
| <to uri="log:info" /> |
| <onFallback> |
| <to uri="kafka:topic" /> |
| </onFallback> |
| </circuitBreaker> |
| `, |
| }, |
| Language: v1.LanguageXML, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:direct", |
| "camel-quarkus:kafka", |
| "camel-quarkus:log", |
| }, |
| meta.Dependencies.List()) |
| |
| assert.True(t, meta.RequiredCapabilities.Has(v1.CapabilityCircuitBreaker)) |
| } |
| |
| func TestXMLRestDependency(t *testing.T) { |
| code := v1.SourceSpec{ |
| |
| DataSpec: v1.DataSpec{ |
| Name: "routes.xml", |
| Content: ` |
| <rest path="/say"> |
| <get uri="/hello"> |
| <to uri="direct:hello"/> |
| </get> |
| <get uri="/bye" consumes="application/json"> |
| <to uri="direct:bye"/> |
| </get> |
| <post uri="/bye"> |
| <to uri="mock:update"/> |
| </post> |
| </rest> |
| `, |
| }, |
| Language: v1.LanguageXML, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:direct", |
| "camel-quarkus:mock", |
| }, |
| meta.Dependencies.List()) |
| |
| assert.True(t, meta.RequiredCapabilities.Has("rest")) |
| } |
| |
| func TestXMLLanguageDependencies(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "routes.xml", |
| Content: ` |
| <from uri="direct:start" /> |
| <transform> |
| <language language="ognl">request.body.name == 'Camel K'</language> |
| </transform> |
| <transform> |
| <simple>${body.toUpperCase()}</simple> |
| </transform> |
| <transform> |
| <mvel>resource:classpath:script.mvel</mvel> |
| </transform> |
| <transform> |
| <jsonpath>$.foo</jsonpath> |
| </transform> |
| <transform> |
| <groovy>request.body += 'modified'</groovy> |
| </transform> |
| <transform> |
| <tokenize>request.body += 'modified'</tokenize> |
| </transform> |
| <transform> |
| <xtokenize>/ns:foo/bar</xtokenize> |
| </transform> |
| <transform> |
| <xpath>//foo/bar</xpath> |
| </transform> |
| <transform> |
| <xquery>//ns:foo/bar</xquery> |
| </transform> |
| <split> |
| <tokenize token=","/> |
| </split> |
| `, |
| }, |
| Language: v1.LanguageXML, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:core", |
| "camel-quarkus:direct", |
| "camel-quarkus:mvel", |
| "camel-quarkus:ognl", |
| "camel-quarkus:xpath", |
| "camel-quarkus:xml-jaxp", |
| "camel-quarkus:jsonpath", |
| "camel-quarkus:saxon", |
| "camel-quarkus:groovy", |
| }, |
| meta.Dependencies.List()) |
| } |
| |
| const yamlWithRest = ` |
| - rest: |
| path: "/" |
| steps: |
| - to: "log:info" |
| - to: "direct:hello" |
| ` |
| const yamlWithCircuitBreaker = ` |
| - from: |
| uri: "direct:start" |
| steps: |
| - circuitBreaker: |
| todo: "not implemented" |
| ` |
| |
| const yamlWithLanguages = ` |
| - from: |
| uri: "direct:start" |
| steps: |
| - set-body: |
| constant: "Hello Camel K" |
| - transform: |
| language: |
| language: "ognl" |
| expression: "request.body.name == 'Camel K'" |
| - transform: |
| simple: "${body.toUpperCase()}" |
| - transform: |
| xquery: "/ns:foo/bar" |
| - transform: |
| xpath: "//foo/bar" |
| - transform: |
| jsonpath: "$.foo" |
| - transform: |
| groovy: "request.body += 'modified'" |
| - split: |
| xtokenize: "/ns:foo/bar" |
| ` |
| |
| func TestYAMLRestDependency(t *testing.T) { |
| code := v1.SourceSpec{ |
| |
| DataSpec: v1.DataSpec{ |
| Name: "routes.yaml", |
| Content: yamlWithRest, |
| }, |
| Language: v1.LanguageYaml, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:direct", |
| "camel-quarkus:log", |
| }, |
| meta.Dependencies.List()) |
| |
| assert.True(t, meta.RequiredCapabilities.Has("rest")) |
| } |
| |
| func TestYAMLCircuitBreakerDependency(t *testing.T) { |
| code := v1.SourceSpec{ |
| |
| DataSpec: v1.DataSpec{ |
| Name: "routes.yaml", |
| Content: yamlWithCircuitBreaker, |
| }, |
| Language: v1.LanguageYaml, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:direct", |
| }, |
| meta.Dependencies.List()) |
| assert.True(t, meta.RequiredCapabilities.Has(v1.CapabilityCircuitBreaker)) |
| } |
| |
| func TestYAMLLanguageDependencies(t *testing.T) { |
| code := v1.SourceSpec{ |
| DataSpec: v1.DataSpec{ |
| Name: "routes.yaml", |
| Content: yamlWithLanguages, |
| }, |
| Language: v1.LanguageYaml, |
| } |
| |
| catalog, err := camel.DefaultCatalog() |
| assert.Nil(t, err) |
| |
| meta := Extract(catalog, code) |
| |
| assert.ElementsMatch( |
| t, |
| []string{ |
| "camel-quarkus:core", |
| "camel-quarkus:direct", |
| "camel-quarkus:ognl", |
| "camel-quarkus:xpath", |
| "camel-quarkus:jsonpath", |
| "camel-quarkus:groovy", |
| "camel-quarkus:saxon", |
| "camel-quarkus:xml-jaxp", |
| }, |
| meta.Dependencies.List()) |
| } |