| /* |
| * 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 org.apache.camel.k.loader.yaml |
| |
| import org.apache.camel.impl.DefaultCamelContext |
| import org.apache.camel.model.ChoiceDefinition |
| import org.apache.camel.model.FilterDefinition |
| import org.apache.camel.model.SplitDefinition |
| import org.apache.camel.model.ToDefinition |
| import org.apache.camel.model.language.SimpleExpression |
| import org.apache.camel.model.language.TokenizerExpression |
| import org.apache.commons.io.IOUtils |
| |
| import java.nio.charset.StandardCharsets |
| |
| class DefinitionsTest extends TestSupport { |
| |
| def "route with id"() { |
| given: |
| def content = ''' |
| - route: |
| id: my-route-id |
| group: my-route-group |
| from: |
| uri: "direct:start" |
| steps: |
| - to: |
| uri: "log:info" |
| '''.stripMargin('|') |
| |
| def camelContext = new DefaultCamelContext() |
| def istream = IOUtils.toInputStream(content, StandardCharsets.UTF_8) |
| when: |
| camelContext.addRoutes(new YamlSourceLoader().builder(istream)) |
| then: |
| camelContext.routeDefinitions[0].id == 'my-route-id' |
| camelContext.routeDefinitions[0].group == 'my-route-group' |
| camelContext.routeDefinitions[0].input.endpointUri == 'direct:start' |
| |
| with(camelContext.routeDefinitions[0].outputs[0], ToDefinition) { |
| endpointUri == 'log:info' |
| } |
| } |
| |
| def "route with cbr"() { |
| given: |
| def content = ''' |
| - from: |
| uri: "direct:start" |
| steps: |
| - choice: |
| when: |
| - simple: "${body.startsWith(\\"a\\")}" |
| steps: |
| - to: |
| uri: "log:when-a" |
| - expression: |
| simple: "${body.startsWith(\\"b\\")}" |
| steps: |
| - to: |
| uri: "log:when-b" |
| otherwise: |
| steps: |
| - to: |
| uri: "log:otherwise" |
| - to: |
| uri: "log:info" |
| '''.stripMargin('|') |
| |
| def camelContext = new DefaultCamelContext() |
| def istream = IOUtils.toInputStream(content, StandardCharsets.UTF_8) |
| when: |
| camelContext.addRoutes(new YamlSourceLoader().builder(istream)) |
| then: |
| camelContext.routeDefinitions[0].input.endpointUri == 'direct:start' |
| |
| with(camelContext.routeDefinitions[0].outputs[0] as ChoiceDefinition) { |
| whenClauses[0].expression.language == 'simple' |
| whenClauses[0].expression.expression == '${body.startsWith("a")}' |
| whenClauses[0].outputs.size() == 1 |
| |
| with(whenClauses[0].outputs[0] as ToDefinition) { |
| endpointUri == 'log:when-a' |
| } |
| |
| whenClauses[1].expression.language == 'simple' |
| whenClauses[1].expression.expression == '${body.startsWith("b")}' |
| whenClauses[1].outputs.size() == 1 |
| |
| with(whenClauses[1].outputs[0] as ToDefinition) { |
| endpointUri == 'log:when-b' |
| } |
| |
| otherwise.outputs.size() == 1 |
| } |
| |
| with(camelContext.routeDefinitions[0].outputs[1] as ToDefinition) { |
| endpointUri == 'log:info' |
| } |
| } |
| |
| def "route with split"() { |
| given: |
| def content = ''' |
| - from: |
| uri: "direct:start" |
| steps: |
| - split: |
| tokenize: "," |
| steps: |
| - to: "log:split1" |
| - to: "log:split2" |
| - to: "log:info" |
| '''.stripMargin('|') |
| |
| def camelContext = new DefaultCamelContext() |
| def istream = IOUtils.toInputStream(content, StandardCharsets.UTF_8) |
| when: |
| camelContext.addRoutes(new YamlSourceLoader().builder(istream)) |
| then: |
| camelContext.routeDefinitions[0].input.endpointUri == 'direct:start' |
| camelContext.routeDefinitions[0].outputs.size() == 2 |
| |
| with(camelContext.routeDefinitions[0].outputs[0] as SplitDefinition) { |
| with(expression as TokenizerExpression) { |
| token == ',' |
| } |
| |
| outputs.size() == 2 |
| |
| with(outputs[0] as ToDefinition) { |
| endpointUri == 'log:split1' |
| } |
| with(outputs[1] as ToDefinition) { |
| endpointUri == 'log:split2' |
| } |
| } |
| |
| with(camelContext.routeDefinitions[0].outputs[1] as ToDefinition) { |
| endpointUri == 'log:info' |
| } |
| } |
| |
| def "flow style route with split"() { |
| given: |
| def content = ''' |
| - from: |
| uri: "direct:start" |
| steps: |
| - split: |
| tokenize: "," |
| - to: "log:info" |
| '''.stripMargin('|') |
| |
| def camelContext = new DefaultCamelContext() |
| def istream = IOUtils.toInputStream(content, StandardCharsets.UTF_8) |
| when: |
| camelContext.addRoutes(new YamlSourceLoader().builder(istream)) |
| then: |
| camelContext.routeDefinitions[0].input.endpointUri == 'direct:start' |
| camelContext.routeDefinitions[0].outputs.size() == 1 |
| |
| with(camelContext.routeDefinitions[0].outputs[0] as SplitDefinition) { |
| with(expression as TokenizerExpression) { |
| token == ',' |
| } |
| |
| outputs.size() == 1 |
| |
| with(outputs[0] as ToDefinition) { |
| endpointUri == 'log:info' |
| } |
| } |
| } |
| |
| def "route with filter"() { |
| given: |
| def content = ''' |
| - from: |
| uri: "direct:start" |
| steps: |
| - filter: |
| simple: "${body.startsWith(\\"a\\")}" |
| steps: |
| - to: "log:filter1" |
| - to: "log:filter2" |
| - to: "log:info" |
| '''.stripMargin('|') |
| |
| def camelContext = new DefaultCamelContext() |
| def istream = IOUtils.toInputStream(content, StandardCharsets.UTF_8) |
| when: |
| camelContext.addRoutes(new YamlSourceLoader().builder(istream)) |
| then: |
| camelContext.routeDefinitions[0].input.endpointUri == 'direct:start' |
| camelContext.routeDefinitions[0].outputs.size() == 2 |
| |
| with(camelContext.routeDefinitions[0].outputs[0] as FilterDefinition) { |
| with(expression as SimpleExpression) { |
| expression == '${body.startsWith("a")}' |
| } |
| |
| outputs.size() == 2 |
| |
| with(outputs[0] as ToDefinition) { |
| endpointUri == 'log:filter1' |
| } |
| with(outputs[1] as ToDefinition) { |
| endpointUri == 'log:filter2' |
| } |
| } |
| |
| with(camelContext.routeDefinitions[0].outputs[1] as ToDefinition) { |
| endpointUri == 'log:info' |
| } |
| } |
| |
| def "flow style route with filter"() { |
| given: |
| def content = ''' |
| - from: |
| uri: "direct:start" |
| steps: |
| - filter: |
| simple: "${body.startsWith(\\"a\\")}" |
| - to: "log:info" |
| '''.stripMargin('|') |
| |
| def camelContext = new DefaultCamelContext() |
| def istream = IOUtils.toInputStream(content, StandardCharsets.UTF_8) |
| when: |
| camelContext.addRoutes(new YamlSourceLoader().builder(istream)) |
| then: |
| camelContext.routeDefinitions[0].input.endpointUri == 'direct:start' |
| camelContext.routeDefinitions[0].outputs.size() == 1 |
| |
| with(camelContext.routeDefinitions[0].outputs[0] as FilterDefinition) { |
| with(expression as SimpleExpression) { |
| expression == '${body.startsWith("a")}' |
| } |
| |
| outputs.size() == 1 |
| |
| with(outputs[0] as ToDefinition) { |
| endpointUri == 'log:info' |
| } |
| } |
| } |
| } |