tests: add tests for APIResult
Some checks failed
Test / build (map[name:nightly]) (push) Successful in 2m1s
Test / build (map[name:stable]) (push) Successful in 2m37s
Release Please / Release-plz (push) Failing after 19s

This commit is contained in:
Paul Campbell 2024-12-14 19:51:55 +00:00
parent d45e7a8443
commit 547b659a97
4 changed files with 126 additions and 2 deletions

View file

@ -28,6 +28,7 @@ tracing-subscriber = "0.3"
[dev-dependencies] [dev-dependencies]
assert2 = "0.3" assert2 = "0.3"
http = "1.2"
mutants = "0.0" mutants = "0.0"
pretty_assertions = "1.4" pretty_assertions = "1.4"
rstest = "0.23" rstest = "0.23"

View file

@ -3,12 +3,19 @@ use kxio::{net::Response, print::Printer};
use crate::{e, s}; use crate::{e, s};
pub(crate) struct APIResult<T> { #[derive(Debug)]
pub(crate) struct APIResult<T>
where
T: for<'a> serde::Deserialize<'a>,
{
pub(crate) text: String, pub(crate) text: String,
pub(crate) result: Result<T, kxio::net::Error>, pub(crate) result: Result<T, kxio::net::Error>,
} }
impl<T: for<'a> serde::Deserialize<'a>> APIResult<T> { impl<T> APIResult<T>
where
T: for<'a> serde::Deserialize<'a>,
{
pub async fn new(response: kxio::net::Result<Response>, prt: &Printer) -> Self { pub async fn new(response: kxio::net::Result<Response>, prt: &Printer) -> Self {
match response { match response {
Ok(response) => { Ok(response) => {

114
src/tests/api_result.rs Normal file
View file

@ -0,0 +1,114 @@
use http::response::Builder;
use serde::Deserialize;
//
use super::*;
use serde_json::json;
use crate::api_result::APIResult;
#[rstest::fixture]
fn printers() -> (kxio::print::Printer, kxio::print::TestPrint) {
let prt = kxio::print::test();
let test_prt = prt.clone();
let test_prt = test_prt.as_test().unwrap().clone();
(prt, test_prt)
}
#[derive(Deserialize, Debug, PartialEq, Eq)]
struct TestData {
foo: String,
}
#[rstest::rstest]
#[tokio::test]
async fn test_result_ok_parsable_text(printers: (kxio::print::Printer, kxio::print::TestPrint)) {
#[derive(Deserialize, Debug, PartialEq, Eq)]
struct TestData {
foo: String,
}
let json_doc: String = s!(json!({"foo":"bar"}));
let response = Builder::default().body(json_doc.clone()).expect("response");
let result: APIResult<TestData> = APIResult::new(Ok(response.into()), &printers.0).await;
assert_peq!(result.text, json_doc);
}
#[rstest::rstest]
#[tokio::test]
async fn test_result_ok_parsable_result(printers: (kxio::print::Printer, kxio::print::TestPrint)) {
#[derive(Deserialize, Debug, PartialEq, Eq)]
struct TestData {
foo: String,
}
let json_doc: String = s!(json!({"foo":"bar"}));
let response = Builder::default().body(json_doc.clone()).expect("response");
let result: APIResult<TestData> = APIResult::new(Ok(response.into()), &printers.0).await;
let_assert!(Ok(result) = result.result);
assert_peq!(result, TestData { foo: s!("bar") });
}
#[rstest::rstest]
#[tokio::test]
async fn test_result_ok_unparsable_text(printers: (kxio::print::Printer, kxio::print::TestPrint)) {
#[derive(Deserialize, Debug, PartialEq, Eq)]
struct TestData {
foo: String,
}
let invalid_doc: String = s!("foo-bar");
let response = Builder::default()
.body(invalid_doc.clone())
.expect("response");
let result: APIResult<TestData> = APIResult::new(Ok(response.into()), &printers.0).await;
assert_peq!(result.text, invalid_doc);
}
#[rstest::rstest]
#[tokio::test]
async fn test_result_ok_unparsable_result(
printers: (kxio::print::Printer, kxio::print::TestPrint),
) {
#[derive(Deserialize, Debug, PartialEq, Eq)]
struct TestData {
foo: String,
}
let invalid_doc: String = s!("foo-bar");
let response = Builder::default()
.body(invalid_doc.clone())
.expect("response");
let result: APIResult<TestData> = APIResult::new(Ok(response.into()), &printers.0).await;
let_assert!(Err(result) = result.result);
assert_eq!(s!(result), s!("expected ident at line 1 column 2"));
}
#[rstest::rstest]
#[tokio::test]
async fn test_result_error_text(printers: (kxio::print::Printer, kxio::print::TestPrint)) {
#[derive(Deserialize, Debug, PartialEq, Eq)]
struct TestData {
foo: String,
}
let message = s!("error message");
let result: APIResult<TestData> =
APIResult::new(Err(message.clone().into()), &printers.0).await;
assert_peq!(result.text, s!(""));
}
#[rstest::rstest]
#[tokio::test]
async fn test_result_error_result(printers: (kxio::print::Printer, kxio::print::TestPrint)) {
#[derive(Deserialize, Debug, PartialEq, Eq)]
struct TestData {
foo: String,
}
let message = s!("error message");
let result: APIResult<TestData> =
APIResult::new(Err(message.clone().into()), &printers.0).await;
let_assert!(Err(result) = result.result);
assert_peq!(s!(result), message);
}

View file

@ -4,11 +4,13 @@ use std::collections::HashMap;
// type TestResult = Result<(), Box<dyn std::error::Error>>; // type TestResult = Result<(), Box<dyn std::error::Error>>;
use assert2::let_assert; use assert2::let_assert;
use pretty_assertions::assert_eq as assert_peq;
use crate::{ use crate::{
config::AppConfig, f, init::run, nextcloud::NextcloudConfig, s, trello::TrelloConfig, Ctx, NAME, config::AppConfig, f, init::run, nextcloud::NextcloudConfig, s, trello::TrelloConfig, Ctx, NAME,
}; };
mod api_result;
mod config; mod config;
pub(crate) mod given; pub(crate) mod given;
mod init; mod init;