git-next/crates/cli/src/repo/tests/mod.rs

127 lines
3.6 KiB
Rust
Raw Normal View History

2024-06-27 21:10:41 +01:00
//
use crate::{
git,
repo::{
messages::{CloneRepo, MessageToken},
ActorLog, RepoActor,
},
2024-06-27 21:10:41 +01:00
};
use git_next_core::{
git::{
commit::Sha,
repository::{
factory::{mock, MockRepositoryFactory, RepositoryFactory},
open::{MockOpenRepositoryLike, OpenRepositoryLike},
Direction,
},
Commit, ForgeLike, Generation, MockForgeLike, RepoDetails,
},
message,
webhook::{forge_notification::Body, Push},
BranchName, ForgeAlias, ForgeConfig, ForgeNotification, ForgeType, GitDir, Hostname,
RegisteredWebhook, RemoteUrl, RepoAlias, RepoBranches, RepoConfig, RepoConfigSource,
ServerRepoConfig, StoragePathType, WebhookAuth, WebhookId,
2024-06-27 21:10:41 +01:00
};
use assert2::let_assert;
use kameo::{
message::{Context, Message},
Reply,
};
2024-06-27 21:10:41 +01:00
use mockall::predicate::eq;
use tracing::{debug, error};
2024-06-27 21:10:41 +01:00
use std::{
collections::{BTreeMap, HashMap},
sync::{Arc, RwLock},
time::Duration,
2024-06-27 21:10:41 +01:00
};
type TestResult = Result<(), Box<dyn std::error::Error>>;
mod branch;
mod expect;
pub mod given;
mod handlers;
mod load;
mod when;
pub async fn tick(millis: u64) {
tokio::time::sleep(Duration::from_millis(millis)).await;
}
impl ActorLog {
pub async fn no_message_contains(
&self,
needle: impl AsRef<str> + Send + std::fmt::Display,
) -> TestResult {
if self.find_in_messages(needle.as_ref()).await? {
error!(?self, "");
2024-06-27 21:10:41 +01:00
panic!("found unexpected message: {needle}");
}
Ok(())
}
pub async fn require_message_containing(
2024-06-27 21:10:41 +01:00
&self,
needle: impl AsRef<str> + Send + std::fmt::Display,
2024-06-27 21:10:41 +01:00
) -> TestResult {
if !self.find_in_messages(needle.as_ref()).await? {
error!(?self, "");
2024-06-27 21:10:41 +01:00
panic!("expected message not found: {needle}");
}
Ok(())
}
async fn find_in_messages(
2024-06-27 21:10:41 +01:00
&self,
needle: impl AsRef<str> + Send,
2024-06-27 21:10:41 +01:00
) -> Result<bool, Box<dyn std::error::Error>> {
// Very short sleep to allow tests to get a chance to tick
// This should be enough for most tests.
tokio::time::sleep(Duration::from_millis(5)).await;
2024-06-27 21:10:41 +01:00
let found = self
.read()
.await
2024-06-27 21:10:41 +01:00
.iter()
.any(|message| message.contains(needle.as_ref()));
Ok(found)
}
}
message!(ExamineActor => RepoActorView, "Request a view of the current state of the [RepoActor].");
impl Message<ExamineActor> for RepoActor {
type Reply = RepoActorView;
2024-06-27 21:10:41 +01:00
async fn handle(
&mut self,
_msg: ExamineActor,
_ctx: Context<'_, Self, Self::Reply>,
) -> Self::Reply {
2024-06-27 21:10:41 +01:00
let repo_actor: &Self = self;
Self::Reply::from(repo_actor)
2024-06-27 21:10:41 +01:00
}
}
#[derive(Debug, Reply)]
2024-06-27 21:10:41 +01:00
pub struct RepoActorView {
pub repo_details: RepoDetails,
pub webhook_id: Option<WebhookId>, // INFO: if [None] then no webhook is configured
pub webhook_auth: Option<WebhookAuth>, // INFO: if [None] then no webhook is configured
pub last_main_commit: Option<Commit>,
pub last_next_commit: Option<Commit>,
pub last_dev_commit: Option<Commit>,
2024-06-27 21:10:41 +01:00
}
impl From<&RepoActor> for RepoActorView {
fn from(repo_actor: &RepoActor) -> Self {
Self {
repo_details: repo_actor.repo_details.clone(),
webhook_id: repo_actor.webhook_id.clone(),
webhook_auth: repo_actor.webhook_auth.clone(),
last_main_commit: repo_actor.last_main_commit.clone(),
last_next_commit: repo_actor.last_next_commit.clone(),
last_dev_commit: repo_actor.last_dev_commit.clone(),
}
}
}