blob: 5485dbc6d9f3cad05f6d725c0d7b49cb2bb02abc [file]
// 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.
use iggy::prelude::{IggyClient, StreamClient, TopicClient, TopicCreateOptions};
use iggy_common::{
Consumer, Identifier, IggyExpiry, IggyMessage, MaxTopicSize, Partitioning,
PersonalAccessTokenExpiry, UserStatus,
};
use iggy_common::{
ConsumerGroupClient, ConsumerOffsetClient, MessageClient, PersonalAccessTokenClient, UserClient,
};
use std::error::Error;
/// Seed error type for compatibility.
pub type SeedError = Box<dyn Error + Send + Sync>;
/// Standard names used by MCP seed functions.
pub mod names {
pub use crate::harness::helpers::USER_PASSWORD;
pub const STREAM: &str = "test_stream";
pub const TOPIC: &str = "test_topic";
pub const TOPIC_2: &str = "test_topic_2";
pub const MESSAGE_PAYLOAD: &str = "test_message";
pub const CONSUMER_GROUP: &str = "test_consumer_group";
pub const CONSUMER: &str = "mcp";
pub const USER: &str = "test_user";
pub const PERSONAL_ACCESS_TOKEN: &str = "test_personal_access_token";
}
/// Creates a single stream named "test".
pub async fn stream_only(client: &IggyClient) -> Result<(), SeedError> {
client.create_stream("test").await?;
Ok(())
}
/// Creates a stream with a topic.
pub async fn stream_with_topic(client: &IggyClient) -> Result<(), SeedError> {
client.create_stream("test_stream").await?;
client
.create_topic(
&"test_stream".try_into()?,
"test_topic",
&TopicCreateOptions {
partitions_count: Some(1),
message_expiry: Some(IggyExpiry::NeverExpire),
max_topic_size: Some(MaxTopicSize::Unlimited),
..TopicCreateOptions::default()
},
)
.await?;
Ok(())
}
/// Seed for connector tests: creates stream and topic that connector will subscribe to.
pub async fn connector_stream(client: &IggyClient) -> Result<(), SeedError> {
let stream_id: Identifier = names::STREAM.try_into()?;
client.create_stream(names::STREAM).await?;
client
.create_topic(
&stream_id,
names::TOPIC,
&TopicCreateOptions {
partitions_count: Some(1),
..TopicCreateOptions::default()
},
)
.await?;
Ok(())
}
/// Seed for multi-topic connector tests: creates stream with two topics.
/// Both topics must exist before connector runtime starts (runtime health check
/// validates all configured topics).
pub async fn connector_multi_topic_stream(client: &IggyClient) -> Result<(), SeedError> {
let stream_id: Identifier = names::STREAM.try_into()?;
client.create_stream(names::STREAM).await?;
client
.create_topic(
&stream_id,
names::TOPIC,
&TopicCreateOptions {
partitions_count: Some(1),
..TopicCreateOptions::default()
},
)
.await?;
client
.create_topic(
&stream_id,
names::TOPIC_2,
&TopicCreateOptions {
partitions_count: Some(1),
..TopicCreateOptions::default()
},
)
.await?;
Ok(())
}
/// Standard MCP test data: stream, topic, message, consumer group, consumer offset, user, PAT.
pub async fn mcp_standard(client: &IggyClient) -> Result<(), SeedError> {
let stream_id: Identifier = names::STREAM.try_into()?;
let topic_id: Identifier = names::TOPIC.try_into()?;
client.create_stream(names::STREAM).await?;
client
.create_topic(
&stream_id,
names::TOPIC,
&TopicCreateOptions {
partitions_count: Some(1),
..TopicCreateOptions::default()
},
)
.await?;
let mut messages = vec![
IggyMessage::builder()
.payload(names::MESSAGE_PAYLOAD.into())
.build()?,
];
client
.send_messages(
&stream_id,
&topic_id,
&Partitioning::partition_id(0),
&mut messages,
)
.await?;
let consumer = Consumer::new(Identifier::named(names::CONSUMER)?);
client
.store_consumer_offset(&consumer, &stream_id, &topic_id, Some(0), 0)
.await?;
client
.create_consumer_group(&stream_id, &topic_id, names::CONSUMER_GROUP)
.await?;
client
.create_user(names::USER, names::USER_PASSWORD, UserStatus::Active, None)
.await?;
client
.create_personal_access_token(
names::PERSONAL_ACCESS_TOKEN,
PersonalAccessTokenExpiry::NeverExpire,
)
.await?;
Ok(())
}