blob: 6fc47b9d31ccf86e39e0b7c2fef86dc04c217575 [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 crate::state::StateSetup;
use iggy::prelude::IggyExpiry;
use iggy_common::create_consumer_group::CreateConsumerGroup;
use iggy_common::create_partitions::CreatePartitions;
use iggy_common::create_personal_access_token::CreatePersonalAccessToken;
use iggy_common::create_stream::CreateStream;
use iggy_common::create_topic::CreateTopic;
use iggy_common::create_user::CreateUser;
use iggy_common::delete_stream::DeleteStream;
use server::state::State;
use server::state::command::EntryCommand;
use server::state::models::{
CreateConsumerGroupWithId, CreatePersonalAccessTokenWithHash, CreateStreamWithId,
CreateTopicWithId, CreateUserWithId,
};
use server::state::system::SystemState;
#[tokio::test]
async fn should_be_initialized_based_on_state_entries() {
let setup = StateSetup::init().await;
let state = setup.state();
state.init().await.unwrap();
let user_id = 1;
let create_user = CreateUser {
username: "user".to_string(),
password: "secret".to_string(),
status: Default::default(),
permissions: None,
};
let create_user_clone = CreateUser {
username: "user".to_string(),
password: "secret".to_string(),
status: Default::default(),
permissions: None,
};
let stream1_id = 1;
let create_stream1 = CreateStream {
stream_id: Some(stream1_id),
name: "stream1".to_string(),
};
let create_stream1_clone = CreateStream {
stream_id: Some(stream1_id),
name: "stream1".to_string(),
};
let topic1_id = 1;
let create_topic1 = CreateTopic {
stream_id: stream1_id.try_into().unwrap(),
topic_id: Some(topic1_id),
partitions_count: 1,
compression_algorithm: Default::default(),
message_expiry: Default::default(),
max_topic_size: Default::default(),
name: "topic1".to_string(),
replication_factor: None,
};
let create_topic1_clone = CreateTopic {
stream_id: stream1_id.try_into().unwrap(),
topic_id: Some(topic1_id),
partitions_count: 1,
compression_algorithm: Default::default(),
message_expiry: Default::default(),
max_topic_size: Default::default(),
name: "topic1".to_string(),
replication_factor: None,
};
let stream2_id = 2;
let create_stream2 = CreateStream {
stream_id: Some(stream2_id),
name: "stream2".to_string(),
};
let topic2_id = 2;
let create_topic2 = CreateTopic {
stream_id: stream2_id.try_into().unwrap(),
topic_id: Some(topic2_id),
partitions_count: 1,
compression_algorithm: Default::default(),
message_expiry: Default::default(),
max_topic_size: Default::default(),
name: "topic2".to_string(),
replication_factor: None,
};
let create_partitions = CreatePartitions {
stream_id: stream1_id.try_into().unwrap(),
topic_id: topic1_id.try_into().unwrap(),
partitions_count: 2,
};
let delete_stream2 = DeleteStream {
stream_id: stream2_id.try_into().unwrap(),
};
let create_personal_access_token = CreatePersonalAccessTokenWithHash {
command: CreatePersonalAccessToken {
name: "test".to_string(),
expiry: IggyExpiry::NeverExpire,
},
hash: "hash".to_string(),
};
let create_personal_access_token_clone = CreatePersonalAccessTokenWithHash {
command: CreatePersonalAccessToken {
name: "test".to_string(),
expiry: IggyExpiry::NeverExpire,
},
hash: "hash".to_string(),
};
let group_id = 1;
let create_consumer_group = CreateConsumerGroup {
stream_id: stream1_id.try_into().unwrap(),
topic_id: topic1_id.try_into().unwrap(),
group_id: Some(group_id),
name: "test".to_string(),
};
let create_consumer_group_clone = CreateConsumerGroup {
stream_id: stream1_id.try_into().unwrap(),
topic_id: topic1_id.try_into().unwrap(),
group_id: Some(group_id),
name: "test".to_string(),
};
state
.apply(
user_id,
&EntryCommand::CreateUser(CreateUserWithId {
user_id,
command: create_user,
}),
)
.await
.unwrap();
state
.apply(
user_id,
&EntryCommand::CreateStream(CreateStreamWithId {
stream_id: stream1_id,
command: create_stream1,
}),
)
.await
.unwrap();
state
.apply(
user_id,
&EntryCommand::CreateTopic(CreateTopicWithId {
topic_id: topic1_id,
command: create_topic1,
}),
)
.await
.unwrap();
state
.apply(
user_id,
&EntryCommand::CreateStream(CreateStreamWithId {
stream_id: stream2_id,
command: create_stream2,
}),
)
.await
.unwrap();
state
.apply(
user_id,
&EntryCommand::CreateTopic(CreateTopicWithId {
topic_id: topic2_id,
command: create_topic2,
}),
)
.await
.unwrap();
state
.apply(user_id, &EntryCommand::CreatePartitions(create_partitions))
.await
.unwrap();
state
.apply(user_id, &EntryCommand::DeleteStream(delete_stream2))
.await
.unwrap();
state
.apply(
user_id,
&EntryCommand::CreatePersonalAccessToken(create_personal_access_token),
)
.await
.unwrap();
state
.apply(
user_id,
&EntryCommand::CreateConsumerGroup(CreateConsumerGroupWithId {
group_id,
command: create_consumer_group,
}),
)
.await
.unwrap();
let entries = state.load_entries().await.unwrap();
assert_eq!(entries.len(), 9);
let mut system = SystemState::init(entries).await.unwrap();
assert_eq!(system.users.len(), 1);
let mut user = system.users.remove(&user_id).unwrap();
assert_eq!(user.id, user_id);
assert_eq!(user.username, create_user_clone.username);
assert_eq!(user.password_hash, create_user_clone.password);
assert_eq!(user.personal_access_tokens.len(), 1);
let personal_access_token = user
.personal_access_tokens
.remove(&create_personal_access_token_clone.command.name)
.unwrap();
assert_eq!(
personal_access_token.token_hash,
create_personal_access_token_clone.hash
);
assert_eq!(
personal_access_token.name,
create_personal_access_token_clone.command.name
);
assert_eq!(system.streams.len(), 1);
let mut stream = system
.streams
.remove(&create_stream1_clone.stream_id.unwrap())
.unwrap();
assert_eq!(stream.id, create_stream1_clone.stream_id.unwrap());
assert_eq!(stream.name, create_stream1_clone.name);
assert_eq!(stream.topics.len(), 1);
let mut topic = stream
.topics
.remove(&create_topic1_clone.topic_id.unwrap())
.unwrap();
assert_eq!(topic.id, create_topic1_clone.topic_id.unwrap());
assert_eq!(topic.name, create_topic1_clone.name);
assert_eq!(topic.partitions.len(), 3);
assert_eq!(topic.consumer_groups.len(), 1);
let consumer_group = topic.consumer_groups.remove(&group_id).unwrap();
assert_eq!(
consumer_group.id,
create_consumer_group_clone.group_id.unwrap()
);
assert_eq!(consumer_group.name, create_consumer_group_clone.name);
}