This is an automated email from the ASF dual-hosted git repository. acosentino pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel-kamelets.git
The following commit(s) were added to refs/heads/main by this push: new e1a7e27e chore(e2e): Add Jira Kamelets tests (#2049) e1a7e27e is described below commit e1a7e27e6eee34546e7478562d16a5eaa4433786 Author: Christoph Deppisch <cdeppi...@redhat.com> AuthorDate: Fri May 17 06:20:47 2024 +0200 chore(e2e): Add Jira Kamelets tests (#2049) --- .../src/test/resources/jira/README.md | 45 +++++++ .../resources/jira/jira-add-issue-sink-pipe.yaml | 74 ++++++++++++ .../resources/jira/jira-add-issue-sink.feature | 109 +++++++++++++++++ .../src/test/resources/jira/jira-source-pipe.yaml | 34 ++++++ .../src/test/resources/jira/jira-source.feature | 130 +++++++++++++++++++++ .../src/test/resources/jira/yaks-config.yaml | 55 +++++++++ 6 files changed, 447 insertions(+) diff --git a/tests/camel-kamelets-itest/src/test/resources/jira/README.md b/tests/camel-kamelets-itest/src/test/resources/jira/README.md new file mode 100644 index 00000000..9d1801d4 --- /dev/null +++ b/tests/camel-kamelets-itest/src/test/resources/jira/README.md @@ -0,0 +1,45 @@ +# Jira Kamelet test + +This test verifies Jira Kamelets. + +## Objectives + +The test verifies the Jira Kamelet by creating a Camel K integration that uses the Kamelet interacting with the Jira REST API. +The Jira API is simulated during the test with an Http server endpoint. + +### Test Kamelet + +The test performs the following high level steps: + +*Preparation* +- Create a Jira API server that will simulate the Jira API (e.g. providing a new issue as a response) + +*Scenario* +- Create the Camel K integration that uses the Jira Kamelets +- Wait for the Camel K integration to start and listen for new issue events +- Simulate a new issue returned by the Jira API server +- Verify the issue was logged by Camel K integrations using the log-sink + +*Cleanup* +- Delete the Camel K integration + +## Installation + +The test assumes that you have access to a Kubernetes cluster and that the Camel K operator as well as the YAKS operator is installed +and running. + +You can review the installation steps for the operators in the documentation: + +- [Install Camel K operator](https://camel.apache.org/camel-k/latest/installation/installation.html) +- [Install YAKS operator](https://github.com/citrusframework/yaks#installation) + +## Run the test + +```shell script +$ yaks run --local src/test/resources/jira/jira-source.feature +$ yaks run --local src/test/resources/jira/jira-add-issue-sink.feature +``` + +You can increase number of attempts to run the test by adding: "-e YAKS_CAMELK_MAX_ATTEMPTS=1000" + +You will be provided with the test log output and the test results. diff --git a/tests/camel-kamelets-itest/src/test/resources/jira/jira-add-issue-sink-pipe.yaml b/tests/camel-kamelets-itest/src/test/resources/jira/jira-add-issue-sink-pipe.yaml new file mode 100644 index 00000000..bb798620 --- /dev/null +++ b/tests/camel-kamelets-itest/src/test/resources/jira/jira-add-issue-sink-pipe.yaml @@ -0,0 +1,74 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +apiVersion: camel.apache.org/v1 +kind: Pipe +metadata: + name: jira-add-issue-sink-pipe +spec: + source: + ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: timer-source + properties: + period: ${timer.source.period} + message: '${jira.issue.description}' + steps: + - ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: insert-header-action + properties: + name: projectKey + value: ${jira.project.key} + - ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: insert-header-action + properties: + name: issueTypeName + value: ${jira.issue.type} + - ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: insert-header-action + properties: + name: issueSummary + value: ${jira.issue.summary} + - ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: insert-header-action + properties: + name: issueAssignee + value: ${jira.issue.assignee} + - ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: log-action + properties: + showHeaders: true + sink: + ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: jira-add-issue-sink + properties: + jiraUrl: yaks:resolveURL('jira-service') + username: ${jira.username} + password: ${jira.password} diff --git a/tests/camel-kamelets-itest/src/test/resources/jira/jira-add-issue-sink.feature b/tests/camel-kamelets-itest/src/test/resources/jira/jira-add-issue-sink.feature new file mode 100644 index 00000000..313ba8c2 --- /dev/null +++ b/tests/camel-kamelets-itest/src/test/resources/jira/jira-add-issue-sink.feature @@ -0,0 +1,109 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +Feature: Jira Kamelet - Sink + + Background: + Given variables + | timer.source.period | 10000 | + | jira.project.key | CAMEL | + | jira.project.id | 10001 | + | jira.issue.id | 10001 | + | jira.issue.key | CAMEL-10001 | + | jira.issue.summary | New bug, citrus:randomString(10) | + | jira.issue.assignee | Superman | + | jira.issue.type | Bug | + | jira.issue.description | Sample bug | + | jira.username | yaks | + | jira.password | secr3t | + Given HTTP server timeout is 15000 ms + Given HTTP server "jira-service" + + Scenario: Create Http server + Given create Kubernetes service jira-service + Given purge endpoint jira-service + + Scenario: Verify Jira events + # Create binding + Given load Pipe jira-add-issue-sink-pipe.yaml + # Verify issue type request + Given expect HTTP request header: Authorization="Basic citrus:encodeBase64(${jira.username}:${jira.password})" + When receive GET /rest/api/latest/issuetype + Then HTTP response header: Content-Type="application/json" + And HTTP response body + """ + [ + { + "self": "yaks:resolveURL('jira-service')/rest/api/latest/issueType/1", + "id": "1", + "description": "A problem with the software.", + "iconUrl": "yaks:resolveURL('jira-service')/images/icons/issuetypes/bug.png", + "name": "Bug", + "subtask": false, + "avatarId": 2 + }, + { + "self": "yaks:resolveURL('jira-service')/rest/api/latest/issueType/3", + "id": "3", + "description": "A task that needs to be done.", + "iconUrl": "yaks:resolveURL('jira-service')/images/icons/issuetypes/task.png", + "name": "Task", + "subtask": false, + "avatarId": 1 + } + ] + """ + Then send HTTP 200 OK + # Verify add issue request + Given expect HTTP request header: Authorization="Basic citrus:encodeBase64(${jira.username}:${jira.password})" + Then expect HTTP request body + """ + { + "fields": { + "project": { + "key": "${jira.project.key}" + }, + "summary": "${jira.issue.summary}", + "description": "${jira.issue.description}", + "issuetype": { + "id": "1" + }, + "assignee": { + "name": "${jira.issue.assignee}" + } + }, + "properties": [] + } + """ + When receive POST /rest/api/latest/issue + Then HTTP response body + """ + { + "id": "${jira.issue.id}", + "key": "${jira.issue.key}", + "self": "yaks:resolveURL('jira-service')/rest/api/latest/issue/${jira.issue.id}" + } + """ + Then send HTTP 200 OK + # Verify event + And Camel K integration jira-add-issue-sink-pipe should print ${jira.issue.summary} + + Scenario: Remove resources + # Remove Camel K binding + Given delete Pipe jira-add-issue-sink-pipe + Given delete Kubernetes service jira-service + And stop server component jira-service diff --git a/tests/camel-kamelets-itest/src/test/resources/jira/jira-source-pipe.yaml b/tests/camel-kamelets-itest/src/test/resources/jira/jira-source-pipe.yaml new file mode 100644 index 00000000..f3b4c6a4 --- /dev/null +++ b/tests/camel-kamelets-itest/src/test/resources/jira/jira-source-pipe.yaml @@ -0,0 +1,34 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +apiVersion: camel.apache.org/v1 +kind: Pipe +metadata: + name: jira-source-pipe +spec: + source: + ref: + kind: Kamelet + apiVersion: camel.apache.org/v1 + name: jira-source + properties: + jiraUrl: yaks:resolveURL('jira-service') + username: ${jira.username} + password: ${jira.password} + jql: ${jira.jql} + sink: + uri: log:info diff --git a/tests/camel-kamelets-itest/src/test/resources/jira/jira-source.feature b/tests/camel-kamelets-itest/src/test/resources/jira/jira-source.feature new file mode 100644 index 00000000..34507036 --- /dev/null +++ b/tests/camel-kamelets-itest/src/test/resources/jira/jira-source.feature @@ -0,0 +1,130 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +Feature: Jira Kamelet - Source + + Background: + Given variables + | jira.project.id | 10001 | + | jira.issue.id | 10001 | + | jira.issue.key | CAMEL-1 | + | jira.issue.summary | New bug, citrus:randomString(10) | + | jira.username | yaks | + | jira.password | secr3t | + | jira.jql | assignee=yaks | + Given HTTP server timeout is 120000 ms + Given HTTP server "jira-service" + + Scenario: Create Http server + Given create Kubernetes service jira-service + Given purge endpoint jira-service + + Scenario: Verify Jira events + # Create binding + Given load Pipe jira-source-pipe.yaml + # Verify latest issue request + Given expect HTTP request header: Authorization="Basic citrus:encodeBase64(${jira.username}:${jira.password})" + And expect HTTP request query parameter jql="yaks:urlEncode(${jira.jql})+ORDER+BY+key+desc" + And expect HTTP request query parameter maxResults="1" + When receive GET /rest/api/latest/search + Then HTTP response header: Content-Type="application/json" + And HTTP response body + """ + { + "expand": "", + "startAt": 0, + "maxResults": 1, + "total": 1, + "issues": [ + { + "expand": "", + "id": "${jira.issue.id}", + "key": "${jira.issue.key}", + "self": "yaks:resolveURL('jira-service')/rest/api/latest/issue/${jira.issue.id}", + "transitions": "yaks:resolveURL('jira-service')/rest/api/latest/issue/${jira.issue.key}/transitions" + } + ] + } + """ + Then send HTTP 200 OK + # Verify search request + Given expect HTTP request header: Authorization="Basic citrus:encodeBase64(${jira.username}:${jira.password})" + And expect HTTP request query parameter jql="yaks:urlEncode(${jira.jql})+ORDER+BY+key+desc" + And expect HTTP request query parameter maxResults="50" + And expect HTTP request query parameter expand="schema%2Cnames" + When receive GET /rest/api/latest/search + Then HTTP response header: Content-Type="application/json" + And HTTP response body + """ + { + "expand": "schema,names", + "startAt": 0, + "maxResults": 50, + "total": 1, + "names": { + "custom": "${jira.issue.key}" + }, + "schema": { + "custom": { + "type": "string" + } + }, + "issues": [ + { + "expand": "", + "id": "${jira.issue.id}", + "key": "${jira.issue.key}", + "self": "yaks:resolveURL('jira-service')/rest/api/latest/issue/${jira.issue.id}", + "transitions": "yaks:resolveURL('jira-service')/rest/api/latest/issue/${jira.issue.key}/transitions", + "fields": { + "project": { + "self": "yaks:resolveURL('jira-service')/rest/api/latest/project/${jira.project.id}", + "id": "${jira.project.id}", + "key": "CAMEL" + }, + "summary": "${jira.issue.summary}", + "custom": "${jira.issue.key}", + "issuetype": { + "self": "yaks:resolveURL('jira-service')/rest/api/latest/issuetype/3", + "id": "3", + "description": "A task that needs to be done.", + "iconUrl": "yaks:resolveURL('jira-service')/images/icons/task.gif", + "name": "Task", + "subtask": false + }, + "created": "yaks:currentDate(yyyy-MM-dd'T'HH:mm:ss.SZ)", + "updated": "yaks:currentDate(yyyy-MM-dd'T'HH:mm:ss.SZ)", + "status": { + "self": "yaks:resolveURL('jira-service')/rest/api/latest/status/1", + "id": 1, + "description": "Open task.", + "iconUrl": "yaks:resolveURL('jira-service')/images/icons/status_1.gif", + "name": "Open" + } + } + } + ] + } + """ + Then send HTTP 200 OK + And Camel K integration jira-source-pipe should print ${jira.issue.summary} + + Scenario: Remove resources + # Remove Camel K binding + Given delete Pipe jira-source-pipe + Given delete Kubernetes service jira-service + And stop server component jira-service diff --git a/tests/camel-kamelets-itest/src/test/resources/jira/yaks-config.yaml b/tests/camel-kamelets-itest/src/test/resources/jira/yaks-config.yaml new file mode 100644 index 00000000..52cf9ba2 --- /dev/null +++ b/tests/camel-kamelets-itest/src/test/resources/jira/yaks-config.yaml @@ -0,0 +1,55 @@ +# --------------------------------------------------------------------------- +# 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. +# --------------------------------------------------------------------------- + +config: + namespace: + temporary: false + runtime: + env: + - name: YAKS_CAMEL_AUTO_REMOVE_RESOURCES + value: false + - name: YAKS_CAMELK_AUTO_REMOVE_RESOURCES + value: false + - name: YAKS_KAMELETS_AUTO_REMOVE_RESOURCES + value: false + - name: YAKS_KUBERNETES_AUTO_REMOVE_RESOURCES + value: false + - name: YAKS_KNATIVE_AUTO_REMOVE_RESOURCES + value: false + - name: YAKS_JBANG_CAMEL_DUMP_INTEGRATION_OUTPUT + value: true + - name: YAKS_TESTCONTAINERS_AUTO_REMOVE_RESOURCES + value: false + - name: CITRUS_TYPE_CONVERTER + value: camel + resources: + - jira-source-pipe.yaml + - jira-add-issue-sink-pipe.yaml + cucumber: + tags: + - "not @ignored" + settings: + loggers: + - name: INTEGRATION_STATUS + level: INFO + - name: INTEGRATION_LOGS + level: INFO + dump: + enabled: true + failedOnly: true + includes: + - app=camel-k