Compare commits
3 commits
271f4ec1dc
...
3fd75c43f2
Author | SHA1 | Date | |
---|---|---|---|
3fd75c43f2 | |||
1ca13bb0ae | |||
df755e583b |
13 changed files with 229 additions and 80 deletions
|
@ -4,7 +4,9 @@ members = [
|
||||||
"crates/cli",
|
"crates/cli",
|
||||||
"crates/server",
|
"crates/server",
|
||||||
"crates/config",
|
"crates/config",
|
||||||
|
"crates/config/test",
|
||||||
"crates/git",
|
"crates/git",
|
||||||
|
"crates/git/test",
|
||||||
"crates/forge",
|
"crates/forge",
|
||||||
"crates/forge-forgejo",
|
"crates/forge-forgejo",
|
||||||
"crates/forge-github",
|
"crates/forge-github",
|
||||||
|
@ -24,7 +26,9 @@ expect_used = "warn"
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
git-next-server = { path = "crates/server" }
|
git-next-server = { path = "crates/server" }
|
||||||
git-next-config = { path = "crates/config" }
|
git-next-config = { path = "crates/config" }
|
||||||
|
git-next-config-test = { path = "crates/config/test" }
|
||||||
git-next-git = { path = "crates/git" }
|
git-next-git = { path = "crates/git" }
|
||||||
|
git-next-git-test = { path = "crates/git/test" }
|
||||||
git-next-forge = { path = "crates/forge" }
|
git-next-forge = { path = "crates/forge" }
|
||||||
git-next-forge-forgejo = { path = "crates/forge-forgejo" }
|
git-next-forge-forgejo = { path = "crates/forge-forgejo" }
|
||||||
git-next-forge-github = { path = "crates/forge-github" }
|
git-next-forge-github = { path = "crates/forge-github" }
|
||||||
|
|
16
crates/config/test/Cargo.toml
Normal file
16
crates/config/test/Cargo.toml
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
[package]
|
||||||
|
name = "git-next-config-test"
|
||||||
|
version = { workspace = true }
|
||||||
|
edition = { workspace = true }
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
git-next-config = { workspace = true }
|
||||||
|
|
||||||
|
rand = { workspace = true }
|
||||||
|
kxio = { workspace = true }
|
||||||
|
|
||||||
|
[lints.clippy]
|
||||||
|
nursery = { level = "warn", priority = -1 }
|
||||||
|
# pedantic = "warn"
|
||||||
|
unwrap_used = "warn"
|
||||||
|
expect_used = "warn"
|
74
crates/config/test/src/given.rs
Normal file
74
crates/config/test/src/given.rs
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
//
|
||||||
|
use config::{
|
||||||
|
server::Webhook, webhook::message::Body, BranchName, ForgeAlias, RepoAlias, RepoBranches,
|
||||||
|
WebhookAuth, WebhookId,
|
||||||
|
};
|
||||||
|
use git_next_config as config;
|
||||||
|
|
||||||
|
use rand::RngCore;
|
||||||
|
|
||||||
|
pub fn a_webhook_auth() -> WebhookAuth {
|
||||||
|
WebhookAuth::generate()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum Header {
|
||||||
|
Valid(WebhookAuth, Body),
|
||||||
|
Missing,
|
||||||
|
Invalid,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_webhook_message_body() -> Body {
|
||||||
|
Body::new(a_name())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn repo_branches() -> RepoBranches {
|
||||||
|
RepoBranches::new(a_name(), a_name(), a_name())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_forge_alias() -> ForgeAlias {
|
||||||
|
ForgeAlias::new(a_name())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_repo_alias() -> RepoAlias {
|
||||||
|
RepoAlias::new(a_name())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_network() -> kxio::network::MockNetwork {
|
||||||
|
kxio::network::MockNetwork::new()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_webhook_url(
|
||||||
|
forge_alias: &ForgeAlias,
|
||||||
|
repo_alias: &RepoAlias,
|
||||||
|
) -> git_next_config::server::WebhookUrl {
|
||||||
|
Webhook::new(a_name()).url(forge_alias, repo_alias)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn any_webhook_url() -> git_next_config::server::WebhookUrl {
|
||||||
|
a_webhook_url(&a_forge_alias(), &a_repo_alias())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_name() -> String {
|
||||||
|
use rand::Rng;
|
||||||
|
use std::iter;
|
||||||
|
|
||||||
|
fn generate(len: usize) -> String {
|
||||||
|
const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
|
let mut rng = rand::thread_rng();
|
||||||
|
let one_char = || CHARSET[rng.gen_range(0..CHARSET.len())] as char;
|
||||||
|
iter::repeat_with(one_char).take(len).collect()
|
||||||
|
}
|
||||||
|
generate(5)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_webhook_id() -> WebhookId {
|
||||||
|
WebhookId::new(a_name())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_github_webhook_id() -> i64 {
|
||||||
|
rand::thread_rng().next_u32().into()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_branch_name() -> BranchName {
|
||||||
|
BranchName::new(a_name())
|
||||||
|
}
|
1
crates/config/test/src/lib.rs
Normal file
1
crates/config/test/src/lib.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pub mod given;
|
|
@ -39,6 +39,8 @@ tokio = { workspace = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
# Testing
|
# Testing
|
||||||
|
git-next-config-test = { workspace = true }
|
||||||
|
git-next-git-test = { workspace = true }
|
||||||
assert2 = { workspace = true }
|
assert2 = { workspace = true }
|
||||||
rand = { workspace = true }
|
rand = { workspace = true }
|
||||||
|
|
||||||
|
|
|
@ -10,8 +10,8 @@ mod forgejo {
|
||||||
|
|
||||||
use crate::ForgeJo;
|
use crate::ForgeJo;
|
||||||
use config::{
|
use config::{
|
||||||
webhook::message::Body, ForgeAlias, ForgeConfig, ForgeType, GitDir, RepoAlias,
|
webhook::message::Body, ForgeConfig, ForgeType, GitDir, ServerRepoConfig, WebhookAuth,
|
||||||
RepoBranches, ServerRepoConfig, WebhookAuth, WebhookMessage,
|
WebhookMessage,
|
||||||
};
|
};
|
||||||
use git::ForgeLike as _;
|
use git::ForgeLike as _;
|
||||||
|
|
||||||
|
@ -568,9 +568,11 @@ mod forgejo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mod given {
|
mod given {
|
||||||
|
pub use git_next_config_test::given::*;
|
||||||
|
pub use git_next_git_test::given::*;
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use git_next_config::{server::Webhook, WebhookId};
|
|
||||||
use kxio::network::{MockNetwork, StatusCode};
|
use kxio::network::{MockNetwork, StatusCode};
|
||||||
use rand::RngCore;
|
use rand::RngCore;
|
||||||
use serde_json::json;
|
use serde_json::json;
|
||||||
|
@ -604,10 +606,6 @@ mod forgejo {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn a_webhook_auth() -> WebhookAuth {
|
|
||||||
WebhookAuth::generate()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum Header {
|
pub enum Header {
|
||||||
Valid(WebhookAuth),
|
Valid(WebhookAuth),
|
||||||
Missing,
|
Missing,
|
||||||
|
@ -615,6 +613,7 @@ mod forgejo {
|
||||||
NonUlid,
|
NonUlid,
|
||||||
WrongUlid,
|
WrongUlid,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn a_webhook_message(header: Header) -> WebhookMessage {
|
pub fn a_webhook_message(header: Header) -> WebhookMessage {
|
||||||
WebhookMessage::new(
|
WebhookMessage::new(
|
||||||
given::a_forge_alias(),
|
given::a_forge_alias(),
|
||||||
|
@ -623,6 +622,7 @@ mod forgejo {
|
||||||
given::a_webhook_message_body(),
|
given::a_webhook_message_body(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn webhook_headers(header: Header) -> HashMap<String, String> {
|
pub fn webhook_headers(header: Header) -> HashMap<String, String> {
|
||||||
let mut headers = HashMap::new();
|
let mut headers = HashMap::new();
|
||||||
match header {
|
match header {
|
||||||
|
@ -645,19 +645,6 @@ mod forgejo {
|
||||||
}
|
}
|
||||||
headers
|
headers
|
||||||
}
|
}
|
||||||
pub fn a_webhook_message_body() -> Body {
|
|
||||||
Body::new(a_name())
|
|
||||||
}
|
|
||||||
pub fn a_commit() -> git::Commit {
|
|
||||||
git::Commit::new(
|
|
||||||
git::commit::Sha::new(a_name()),
|
|
||||||
git::commit::Message::new(a_name()),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn repo_branches() -> RepoBranches {
|
|
||||||
RepoBranches::new(a_name(), a_name(), a_name())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn a_forgejo_forge(
|
pub fn a_forgejo_forge(
|
||||||
repo_details: &git::RepoDetails,
|
repo_details: &git::RepoDetails,
|
||||||
|
@ -665,6 +652,7 @@ mod forgejo {
|
||||||
) -> ForgeJo {
|
) -> ForgeJo {
|
||||||
ForgeJo::new(repo_details.clone(), net.into())
|
ForgeJo::new(repo_details.clone(), net.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn repo_details() -> git::RepoDetails {
|
pub fn repo_details() -> git::RepoDetails {
|
||||||
git::RepoDetails::new(
|
git::RepoDetails::new(
|
||||||
git::Generation::new(),
|
git::Generation::new(),
|
||||||
|
@ -689,44 +677,6 @@ mod forgejo {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn a_forge_alias() -> ForgeAlias {
|
|
||||||
ForgeAlias::new(a_name())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn a_repo_alias() -> RepoAlias {
|
|
||||||
RepoAlias::new(a_name())
|
|
||||||
}
|
|
||||||
pub fn a_network() -> kxio::network::MockNetwork {
|
|
||||||
kxio::network::MockNetwork::new()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn a_webhook_url(
|
|
||||||
forge_alias: &ForgeAlias,
|
|
||||||
repo_alias: &RepoAlias,
|
|
||||||
) -> git_next_config::server::WebhookUrl {
|
|
||||||
Webhook::new(a_name()).url(forge_alias, repo_alias)
|
|
||||||
}
|
|
||||||
pub fn any_webhook_url() -> git_next_config::server::WebhookUrl {
|
|
||||||
given::a_webhook_url(&given::a_forge_alias(), &given::a_repo_alias())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn a_name() -> String {
|
|
||||||
use rand::Rng;
|
|
||||||
use std::iter;
|
|
||||||
|
|
||||||
fn generate(len: usize) -> String {
|
|
||||||
const CHARSET: &[u8] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
let one_char = || CHARSET[rng.gen_range(0..CHARSET.len())] as char;
|
|
||||||
iter::repeat_with(one_char).take(len).collect()
|
|
||||||
}
|
|
||||||
generate(5)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn a_webhook_id() -> WebhookId {
|
|
||||||
WebhookId::new(given::a_name())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn a_forgejo_webhook_id() -> i64 {
|
pub fn a_forgejo_webhook_id() -> i64 {
|
||||||
rand::thread_rng().next_u32().into()
|
rand::thread_rng().next_u32().into()
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,6 +53,8 @@ actix = { workspace = true }
|
||||||
#
|
#
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
# Testing
|
# Testing
|
||||||
|
git-next-config-test = { workspace = true }
|
||||||
|
git-next-git-test = { workspace = true }
|
||||||
assert2 = { workspace = true }
|
assert2 = { workspace = true }
|
||||||
|
|
||||||
[lints.clippy]
|
[lints.clippy]
|
||||||
|
|
|
@ -52,6 +52,7 @@ pub mod log {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<String> for Error {
|
impl From<String> for Error {
|
||||||
|
#[cfg(not(tarpaulin_include))]
|
||||||
fn from(e: String) -> Self {
|
fn from(e: String) -> Self {
|
||||||
Self::Gix(e)
|
Self::Gix(e)
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,26 +52,30 @@ pub enum Error {
|
||||||
TryId,
|
TryId,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<gix::reference::find::existing::Error> for Error {
|
mod gix_errors {
|
||||||
fn from(value: gix::reference::find::existing::Error) -> Self {
|
#![cfg(not(tarpaulin_include))] // third-party library errors
|
||||||
Self::FindReference(value.to_string())
|
use super::Error;
|
||||||
|
impl From<gix::reference::find::existing::Error> for Error {
|
||||||
|
fn from(value: gix::reference::find::existing::Error) -> Self {
|
||||||
|
Self::FindReference(value.to_string())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl From<gix::object::commit::Error> for Error {
|
impl From<gix::object::commit::Error> for Error {
|
||||||
fn from(value: gix::object::commit::Error) -> Self {
|
fn from(value: gix::object::commit::Error) -> Self {
|
||||||
Self::NoTreeInCommit(value.to_string())
|
Self::NoTreeInCommit(value.to_string())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl From<gix::object::find::existing::Error> for Error {
|
impl From<gix::object::find::existing::Error> for Error {
|
||||||
fn from(value: gix::object::find::existing::Error) -> Self {
|
fn from(value: gix::object::find::existing::Error) -> Self {
|
||||||
Self::FindObject(value.to_string())
|
Self::FindObject(value.to_string())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
impl From<std::string::FromUtf8Error> for Error {
|
impl From<std::string::FromUtf8Error> for Error {
|
||||||
fn from(value: std::string::FromUtf8Error) -> Self {
|
fn from(value: std::string::FromUtf8Error) -> Self {
|
||||||
Self::NonUtf8Blob(value.to_string())
|
Self::NonUtf8Blob(value.to_string())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,36 @@
|
||||||
|
use crate as git;
|
||||||
|
|
||||||
mod commit {
|
mod commit {
|
||||||
use crate::{commit, Commit};
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_return_sha() {
|
fn should_return_sha() {
|
||||||
let sha = commit::Sha::new("sha".to_string());
|
let sha = given::a_commit_sha();
|
||||||
let message = commit::Message::new("message".to_string());
|
let commit = given::a_commit_with_sha(&sha);
|
||||||
let commit = Commit::new(sha.clone(), message);
|
|
||||||
|
|
||||||
assert_eq!(commit.sha(), &sha);
|
assert_eq!(commit.sha(), &sha);
|
||||||
}
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn should_return_message() {
|
fn should_return_message() {
|
||||||
let sha = commit::Sha::new("sha".to_string());
|
let message = given::a_commit_message();
|
||||||
let message = commit::Message::new("message".to_string());
|
let commit = given::a_commit_with_message(&message);
|
||||||
let commit = Commit::new(sha, message.clone());
|
|
||||||
|
|
||||||
assert_eq!(commit.message(), &message);
|
assert_eq!(commit.message(), &message);
|
||||||
}
|
}
|
||||||
|
#[test]
|
||||||
|
fn should_convert_from_push() {
|
||||||
|
let sha = given::a_commit_sha();
|
||||||
|
let message = given::a_commit_message();
|
||||||
|
let push = given::a_webhook_push(&sha, &message);
|
||||||
|
let commit = git::Commit::from(push);
|
||||||
|
|
||||||
|
let expected = git::Commit::new(
|
||||||
|
git::commit::Sha::new(sha.to_string()),
|
||||||
|
git::commit::Message::new(message.to_string()),
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(commit, expected);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mod generation {
|
mod generation {
|
||||||
use crate::Generation;
|
use crate::Generation;
|
||||||
|
@ -160,3 +174,19 @@ mod repo_details {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mod branch {
|
||||||
|
use super::*;
|
||||||
|
use assert2::let_assert;
|
||||||
|
#[test]
|
||||||
|
fn reset_should_fetch_then_push() {
|
||||||
|
// let repository = given::a_mock_open_repository();
|
||||||
|
let repo_detauls = given::repo_details();
|
||||||
|
let_assert!(
|
||||||
|
Ok(result) = git::branch::reset(repository, repo_details, branch_name, git_ref, force)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mod given {
|
||||||
|
pub use git_next_config_test::given::*;
|
||||||
|
pub use git_next_git_test::given::*;
|
||||||
|
}
|
||||||
|
|
19
crates/git/test/Cargo.toml
Normal file
19
crates/git/test/Cargo.toml
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
[package]
|
||||||
|
name = "git-next-git-test"
|
||||||
|
version = { workspace = true }
|
||||||
|
edition = { workspace = true }
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
git-next-git = { workspace = true }
|
||||||
|
git-next-config = { workspace = true }
|
||||||
|
git-next-config-test = { workspace = true }
|
||||||
|
|
||||||
|
rand = { workspace = true }
|
||||||
|
kxio = { workspace = true }
|
||||||
|
# serde_json = { workspace = true }
|
||||||
|
|
||||||
|
[lints.clippy]
|
||||||
|
nursery = { level = "warn", priority = -1 }
|
||||||
|
# pedantic = "warn"
|
||||||
|
unwrap_used = "warn"
|
||||||
|
expect_used = "warn"
|
45
crates/git/test/src/given.rs
Normal file
45
crates/git/test/src/given.rs
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
use git_next_config as config;
|
||||||
|
use git_next_config_test::given::*;
|
||||||
|
use git_next_git as git;
|
||||||
|
|
||||||
|
pub fn a_commit() -> git::Commit {
|
||||||
|
git::Commit::new(a_commit_sha(), a_commit_message())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_commit_with_message(message: &git::commit::Message) -> git::Commit {
|
||||||
|
git::Commit::new(a_commit_sha(), message.to_owned())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_commit_with_sha(sha: &git::commit::Sha) -> git::Commit {
|
||||||
|
git::Commit::new(sha.to_owned(), a_commit_message())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_commit_with(sha: &git::commit::Sha, message: &git::commit::Message) -> git::Commit {
|
||||||
|
git::Commit::new(sha.to_owned(), message.to_owned())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_commit_message() -> git::commit::Message {
|
||||||
|
git::commit::Message::new(a_name())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_commit_sha() -> git::commit::Sha {
|
||||||
|
git::commit::Sha::new(a_name())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn a_webhook_push(
|
||||||
|
sha: &git::commit::Sha,
|
||||||
|
message: &git::commit::Message,
|
||||||
|
) -> config::webhook::Push {
|
||||||
|
let branch = a_branch_name();
|
||||||
|
config::webhook::Push::new(branch, sha.to_string(), message.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn repo_details() -> git::RepoDetails {
|
||||||
|
// generation: Generation,
|
||||||
|
// repo_alias: &RepoAlias,
|
||||||
|
// server_repo_config: &ServerRepoConfig,
|
||||||
|
// forge_alias: &ForgeAlias,
|
||||||
|
// forge_config: &ForgeConfig,
|
||||||
|
// gitdir: GitDir,
|
||||||
|
// git::RepoDetails::new()
|
||||||
|
}
|
1
crates/git/test/src/lib.rs
Normal file
1
crates/git/test/src/lib.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pub mod given;
|
Loading…
Reference in a new issue