This is an automated email from the ASF dual-hosted git repository.
cdeppisch 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 c396496e chore: Add Slack Kamelets E2E tests
c396496e is described below
commit c396496e8c275ca04f3e01b0d42dbfcffba954b8
Author: Christoph Deppisch <[email protected]>
AuthorDate: Mon May 13 16:13:48 2024 +0200
chore: Add Slack Kamelets E2E tests
- Add serverUrl property to slack-source.kamelet for better testability
reasons
- Use local Slack Http server in tests to verify Slack API calls
---
kamelets/slack-source.kamelet.yaml | 9 +-
.../resources/kamelets/slack-source.kamelet.yaml | 9 +-
.../src/test/resources/avro/README.md | 2 +-
.../src/test/resources/aws/s3/README.md | 10 +-
.../src/test/resources/aws/sqs/README.md | 8 +-
.../src/test/resources/protobuf/README.md | 2 +-
.../src/test/resources/slack/README.md | 43 +++++++
.../src/test/resources/slack/slack-sink-pipe.yaml | 46 +++++++
.../src/test/resources/slack/slack-sink.feature | 56 +++++++++
.../test/resources/slack/slack-source-pipe.yaml | 38 ++++++
.../src/test/resources/slack/slack-source.feature | 132 +++++++++++++++++++++
.../src/test/resources/slack/yaks-config.yaml | 55 +++++++++
.../src/test/resources/transformation/README.md | 2 +-
13 files changed, 398 insertions(+), 14 deletions(-)
diff --git a/kamelets/slack-source.kamelet.yaml
b/kamelets/slack-source.kamelet.yaml
index 9cb68895..51b7dac3 100644
--- a/kamelets/slack-source.kamelet.yaml
+++ b/kamelets/slack-source.kamelet.yaml
@@ -37,6 +37,12 @@ spec:
- token
type: object
properties:
+ serverUrl:
+ title: Server URL
+ description: The Slack API server endpoint URL.
+ type: string
+ default: "https://slack.com"
+ example: "https://slack.com"
channel:
title: Channel
description: The Slack channel to receive messages from.
@@ -51,7 +57,7 @@ spec:
- urn:camel:group:credentials
delay:
title: Delay
- description: The delay between polls. If no unit provided, miliseconds
is the default.
+ description: The delay between polls. If no unit provided,
milliseconds is the default.
type: string
default: "60000"
example: "60s or 6000 or 1m"
@@ -107,6 +113,7 @@ spec:
from:
uri: "slack:{{channel}}"
parameters:
+ serverUrl: "{{serverUrl}}"
token: "{{token}}"
delay: "{{delay}}"
naturalOrder: "{{naturalOrder}}"
diff --git
a/library/camel-kamelets/src/main/resources/kamelets/slack-source.kamelet.yaml
b/library/camel-kamelets/src/main/resources/kamelets/slack-source.kamelet.yaml
index 9cb68895..51b7dac3 100644
---
a/library/camel-kamelets/src/main/resources/kamelets/slack-source.kamelet.yaml
+++
b/library/camel-kamelets/src/main/resources/kamelets/slack-source.kamelet.yaml
@@ -37,6 +37,12 @@ spec:
- token
type: object
properties:
+ serverUrl:
+ title: Server URL
+ description: The Slack API server endpoint URL.
+ type: string
+ default: "https://slack.com"
+ example: "https://slack.com"
channel:
title: Channel
description: The Slack channel to receive messages from.
@@ -51,7 +57,7 @@ spec:
- urn:camel:group:credentials
delay:
title: Delay
- description: The delay between polls. If no unit provided, miliseconds
is the default.
+ description: The delay between polls. If no unit provided,
milliseconds is the default.
type: string
default: "60000"
example: "60s or 6000 or 1m"
@@ -107,6 +113,7 @@ spec:
from:
uri: "slack:{{channel}}"
parameters:
+ serverUrl: "{{serverUrl}}"
token: "{{token}}"
delay: "{{delay}}"
naturalOrder: "{{naturalOrder}}"
diff --git a/tests/camel-kamelets-itest/src/test/resources/avro/README.md
b/tests/camel-kamelets-itest/src/test/resources/avro/README.md
index 6825c4de..d9a7bfc0 100644
--- a/tests/camel-kamelets-itest/src/test/resources/avro/README.md
+++ b/tests/camel-kamelets-itest/src/test/resources/avro/README.md
@@ -36,7 +36,7 @@ You can review the installation steps for the tooling in the
documentation:
To run tests with URI based configuration:
```shell script
-$ yaks run --local test/avro/avro-serdes-action.feature
+$ yaks run --local src/test/resources/avro/avro-serdes-action.feature
```
You will be provided with the test log output and the test results.
diff --git a/tests/camel-kamelets-itest/src/test/resources/aws/s3/README.md
b/tests/camel-kamelets-itest/src/test/resources/aws/s3/README.md
index e60a88b4..0848c903 100644
--- a/tests/camel-kamelets-itest/src/test/resources/aws/s3/README.md
+++ b/tests/camel-kamelets-itest/src/test/resources/aws/s3/README.md
@@ -46,31 +46,31 @@ You can review the installation steps for the operators in
the documentation:
To run tests with URI based configuration:
```shell script
-$ yaks test aws-s3-source-uri-conf.feature
+$ yaks run --local src/test/resources/aws-s3-source-uri-conf.feature
```
To run tests with secret based configuration:
```shell script
-$ yaks test aws-s3-source-secret-conf.feature
+$ yaks run --local src/test/resources/aws/s3/aws-s3-source-secret-conf.feature
```
To run tests with property based configuration:
```shell script
-$ yaks test aws-s3-source-property-conf.feature
+$ yaks run --local
src/test/resources/aws/s3/aws-s3-source-property-conf.feature
```
To run tests with URI binding:
```shell script
-$ yaks test aws-s3-uri-pipe.feature
+$ yaks run --local src/test/resources/aws/s3/aws-s3-uri-pipe.feature
```
To run tests with binding to Knative channel:
```shell script
-$ yaks test aws-s3-knative-channel.feature
+$ yaks run --local src/test/resources/aws/s3/aws-s3-knative-channel.feature
```
You will be provided with the test log output and the test results.
diff --git a/tests/camel-kamelets-itest/src/test/resources/aws/sqs/README.md
b/tests/camel-kamelets-itest/src/test/resources/aws/sqs/README.md
index 4d73f245..77125cc7 100644
--- a/tests/camel-kamelets-itest/src/test/resources/aws/sqs/README.md
+++ b/tests/camel-kamelets-itest/src/test/resources/aws/sqs/README.md
@@ -52,25 +52,25 @@ $ yaks test aws-sqs-source-uri-conf.feature
To run tests with secret based configuration:
```shell script
-$ yaks test aws-sqs-source-secret-conf.feature
+$ yaks run --local
src/test/resources/aws/sqs/aws-sqs-source-secret-conf.feature
```
To run tests with property based configuration:
```shell script
-$ yaks test aws-sqs-source-property-conf.feature
+$ yaks run --local
src/test/resources/aws/sqs/aws-sqs-source-property-conf.feature
```
To run tests with URI binding:
```shell script
-$ yaks test aws-sqs-uri-pipe.feature
+$ yaks run --local src/test/resources/aws/sqs/aws-sqs-uri-pipe.feature
```
To run tests with binding to Knative channel:
```shell script
-$ yaks test aws-sqs-knative-channel.feature
+$ yaks run --local src/test/resources/aws/sqs/aws-sqs-knative-channel.feature
```
You will be provided with the test log output and the test results.
diff --git a/tests/camel-kamelets-itest/src/test/resources/protobuf/README.md
b/tests/camel-kamelets-itest/src/test/resources/protobuf/README.md
index 852f5ad8..998c4bcf 100644
--- a/tests/camel-kamelets-itest/src/test/resources/protobuf/README.md
+++ b/tests/camel-kamelets-itest/src/test/resources/protobuf/README.md
@@ -36,7 +36,7 @@ You can review the installation steps for the tooling in the
documentation:
To run tests with URI based configuration:
```shell script
-$ yaks run --local test/protobuf/protobuf-serdes-action.feature
+$ yaks run --local src/test/resources/protobuf/protobuf-serdes-action.feature
```
You will be provided with the test log output and the test results.
diff --git a/tests/camel-kamelets-itest/src/test/resources/slack/README.md
b/tests/camel-kamelets-itest/src/test/resources/slack/README.md
new file mode 100644
index 00000000..f7edc4ae
--- /dev/null
+++ b/tests/camel-kamelets-itest/src/test/resources/slack/README.md
@@ -0,0 +1,43 @@
+# Slack Kamelet test
+
+This test verifies the Slack Kamelets defined in
[slack-source.kamelet.yaml](slack-source.kamelet.yaml)
+
+## Objectives
+
+The test verifies the Slack Kamelets by creating a Camel K integration that
uses the Kamelet to listen for messages on a
+Slack channel using the Slack bot API.
+
+### Test Kamelets
+
+The test performs the following high level steps:
+
+*Preparation*
+- Create a Slack API server that will simulate the Slack API (e.g. providing a
webhook URL or verifying the Slack API channel history calls)
+
+*Scenario*
+- Create the Camel K integration that uses the Slack Kamelets
+- Wait for the Camel K integration to start and listen for Slack messages
+- Create a new message on the Slack channel
+- Verify that the integration has received the message event
+
+*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/slack/slack-source.feature
+$ yaks run --local src/test/resources/slack/slack-sink.feature
+```
+
+You will be provided with the test log output and the test results.
diff --git
a/tests/camel-kamelets-itest/src/test/resources/slack/slack-sink-pipe.yaml
b/tests/camel-kamelets-itest/src/test/resources/slack/slack-sink-pipe.yaml
new file mode 100644
index 00000000..9b8ed911
--- /dev/null
+++ b/tests/camel-kamelets-itest/src/test/resources/slack/slack-sink-pipe.yaml
@@ -0,0 +1,46 @@
+# ---------------------------------------------------------------------------
+# 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: slack-sink-pipe
+spec:
+ source:
+ ref:
+ kind: Kamelet
+ apiVersion: camel.apache.org/v1
+ name: timer-source
+ properties:
+ period: ${timer.source.period}
+ message: '${slack.message}'
+ steps:
+ - ref:
+ kind: Kamelet
+ apiVersion: camel.apache.org/v1
+ name: log-action
+ properties:
+ showHeaders: true
+ sink:
+ ref:
+ kind: Kamelet
+ apiVersion: camel.apache.org/v1
+ name: slack-sink
+ properties:
+ webhookUrl: yaks:resolveURL('slack-service')
+ channel: ${slack.channel}
+ token: ${slack.token}
diff --git
a/tests/camel-kamelets-itest/src/test/resources/slack/slack-sink.feature
b/tests/camel-kamelets-itest/src/test/resources/slack/slack-sink.feature
new file mode 100644
index 00000000..e4b46bbb
--- /dev/null
+++ b/tests/camel-kamelets-itest/src/test/resources/slack/slack-sink.feature
@@ -0,0 +1,56 @@
+# ---------------------------------------------------------------------------
+# 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: Slack Kamelet - Sink
+
+ Background:
+ Given variables
+ | timer.source.period | 10000 |
+ | slack.channel | announcements |
+ | slack.message | Camel rocks! |
+ | slack.user.id | W12345678 |
+ | slack.team.id | T12345678 |
+ Given HTTP server timeout is 15000 ms
+ Given HTTP server "slack-service"
+
+ Scenario: Create Http server
+ Given create Kubernetes service slack-service
+
+ Scenario: Verify Slack events
+ Given variables
+ | slack.token |
xoxb-yaks:randomNumber(10)-yaks:randomNumber(13)-yaks:randomString(34) |
+ # Create binding
+ Given load Pipe slack-sink-pipe.yaml
+ # Verify authentication test
+ Given expect HTTP request header: Content-Type="application/json;
charset=UTF-8"
+ Then expect HTTP request body
+ """
+ {
+ "channel": "${slack.channel}",
+ "text": "${slack.message}",
+ }
+ """
+ When receive POST /
+ Then send HTTP 200 OK
+ # Verify event
+ And Camel K integration slack-sink-pipe should print ${slack.message}
+
+ Scenario: Remove resources
+ # Remove Camel K binding
+ Given delete Pipe slack-sink-pipe
+ Given delete Kubernetes service slack-service
+ And stop server component slack-service
diff --git
a/tests/camel-kamelets-itest/src/test/resources/slack/slack-source-pipe.yaml
b/tests/camel-kamelets-itest/src/test/resources/slack/slack-source-pipe.yaml
new file mode 100644
index 00000000..a02f525c
--- /dev/null
+++ b/tests/camel-kamelets-itest/src/test/resources/slack/slack-source-pipe.yaml
@@ -0,0 +1,38 @@
+# ---------------------------------------------------------------------------
+# 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: slack-source-pipe
+spec:
+ source:
+ ref:
+ kind: Kamelet
+ apiVersion: camel.apache.org/v1
+ name: slack-source
+ properties:
+ serverUrl: yaks:resolveURL('slack-service')
+ channel: ${slack.channel}
+ token: ${slack.token}
+ sink:
+ ref:
+ kind: Kamelet
+ apiVersion: camel.apache.org/v1
+ name: log-sink
+ properties:
+ showHeaders: true
diff --git
a/tests/camel-kamelets-itest/src/test/resources/slack/slack-source.feature
b/tests/camel-kamelets-itest/src/test/resources/slack/slack-source.feature
new file mode 100644
index 00000000..aa8fcb36
--- /dev/null
+++ b/tests/camel-kamelets-itest/src/test/resources/slack/slack-source.feature
@@ -0,0 +1,132 @@
+# ---------------------------------------------------------------------------
+# 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: Slack Kamelet - Source
+
+ Background:
+ Given variables
+ | slack.channel | announcements |
+ | slack.message | Camel rocks! |
+ | slack.user.id | W12345678 |
+ | slack.team.id | T12345678 |
+ Given HTTP server timeout is 15000 ms
+ Given HTTP server "slack-service"
+
+ Scenario: Create Http server
+ Given create Kubernetes service slack-service
+
+ Scenario: Verify Slack events
+ Given variables
+ | slack.token |
xoxb-yaks:randomNumber(10)-yaks:randomNumber(13)-yaks:randomString(34) |
+ # Create binding
+ Given load Pipe slack-source-pipe.yaml
+ # Verify authentication test
+ Given expect HTTP request header: Authorization="Bearer ${slack.token}"
+ Given expect HTTP request header:
Content-Type="application/x-www-form-urlencoded"
+ When receive POST /api/auth.test
+ Then HTTP response body
+ """
+ {
+ "ok": true,
+ "url": "yaks:resolveURL('slack-service')",
+ "team": "Camel Workspace",
+ "user": "yaks",
+ "team_id": "${slack.team.id}",
+ "user_id": "${slack.user.id}"
+ }
+ """
+ Then send HTTP 200 OK
+ # Verify conversations list
+ Given expect HTTP request header: Authorization="Bearer ${slack.token}"
+ When receive POST /api/conversations.list
+ Then HTTP response body
+ """
+ {
+ "ok": true,
+ "channels": [
+ {
+ "id": "yaks:randomString(9, UPPERCASE)",
+ "name": "${slack.channel}",
+ "is_channel": true,
+ "is_group": false,
+ "is_im": false,
+ "created": 1449252889,
+ "creator": "U012A3CDE",
+ "is_archived": false,
+ "is_general": true,
+ "unlinked": 0,
+ "name_normalized": "${slack.channel}",
+ "is_shared": false,
+ "is_ext_shared": false,
+ "is_org_shared": false,
+ "pending_shared": [],
+ "is_pending_ext_shared": false,
+ "is_member": true,
+ "is_private": false,
+ "is_mpim": false,
+ "updated": 1678229664302,
+ "topic": {
+ "value": "Company-wide announcements and work-based
matters",
+ "creator": "",
+ "last_set": 0
+ },
+ "purpose": {
+ "value": "This channel is for team-wide communication and
announcements. All team members are in this channel.",
+ "creator": "",
+ "last_set": 0
+ },
+ "previous_names": [],
+ "num_members": 2
+ }
+ ],
+ "response_metadata": {
+ "next_cursor": "yaks:randomString(32)"
+ }
+ }
+ """
+ Then send HTTP 200 OK
+ # Verify conversations history
+ Given expect HTTP request header: Authorization="Bearer ${slack.token}"
+ When receive POST /api/conversations.history
+ Then HTTP response body
+ """
+ {
+ "ok": true,
+ "messages": [
+ {
+ "type": "message",
+ "user": "${slack.user.id}",
+ "text": "${slack.message}",
+ "ts": "1512085950.000216"
+ }
+ ],
+ "has_more": true,
+ "pin_count": 0,
+ "response_metadata": {
+ "next_cursor": "yaks:randomString(32)"
+ }
+ }
+ """
+ Then send HTTP 200 OK
+ # Verify event
+ And Camel K integration slack-source-pipe should print ${slack.message}
+
+ Scenario: Remove resources
+ # Remove Camel K binding
+ Given delete Pipe slack-source-pipe
+ Given delete Kubernetes service slack-service
+ And stop server component slack-service
diff --git
a/tests/camel-kamelets-itest/src/test/resources/slack/yaks-config.yaml
b/tests/camel-kamelets-itest/src/test/resources/slack/yaks-config.yaml
new file mode 100644
index 00000000..4246b46d
--- /dev/null
+++ b/tests/camel-kamelets-itest/src/test/resources/slack/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:
+ - slack-source-pipe.yaml
+ - slack-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
diff --git
a/tests/camel-kamelets-itest/src/test/resources/transformation/README.md
b/tests/camel-kamelets-itest/src/test/resources/transformation/README.md
index f872f0ee..37b5af72 100644
--- a/tests/camel-kamelets-itest/src/test/resources/transformation/README.md
+++ b/tests/camel-kamelets-itest/src/test/resources/transformation/README.md
@@ -36,7 +36,7 @@ You can review the installation steps for the tooling in the
documentation:
To run tests with URI based configuration:
```shell script
-$ yaks run --local test/avro-data-type/avro-serdes-action.feature
+$ yaks run --local src/test/resources/transformation/data-type-action.feature
```
You will be provided with the test log output and the test results.