From bb8078ce6a691a8f3fba0a82cbec08ea175f2f35 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Sun, 25 Sep 2022 03:13:19 +0000 Subject: [PATCH] Update unit test --- src/error.rs | 2 ++ src/server/result.rs | 28 ++++++++++++++++++++++ src/server/unittest/auth.rs | 33 ++++++++++++++++++++++---- src/server/unittest/mod.rs | 46 +++++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 4 deletions(-) diff --git a/src/error.rs b/src/error.rs index 1492418..d29fec8 100644 --- a/src/error.rs +++ b/src/error.rs @@ -25,6 +25,8 @@ pub enum PixivDownloaderError { ToStrError(http::header::ToStrError), #[cfg(all(feature = "server", feature = "db_sqlite", test))] JSONError(json::Error), + #[cfg(feature = "openssl")] + OpenSSLError(openssl::error::ErrorStack), } impl From<&str> for PixivDownloaderError { diff --git a/src/server/result.rs b/src/server/result.rs index a22dd91..9ba9ac0 100644 --- a/src/server/result.rs +++ b/src/server/result.rs @@ -1,4 +1,6 @@ use crate::ext::json::ToJson2; +#[cfg(test)] +use crate::ext::json::{FromJson, ToJson}; use crate::gettext; use json::JsonValue; @@ -118,3 +120,29 @@ impl ToJson2 for JSONResult { } } } + +#[cfg(test)] +impl FromJson for JSONResult { + type Err = crate::error::PixivDownloaderError; + + fn from_json(value: T) -> Result::Err> { + let value = value.to_json().ok_or("Failed to convert to json")?; + let ok = value["ok"].as_bool().ok_or("ok not found.")?; + if ok { + Ok(Self::Ok(value["result"].clone())) + } else { + let code = value["code"].as_i32().ok_or("code not found.")?; + let msg = value["msg"].as_str().ok_or("msg not found.")?.to_owned(); + let debug_msg = value["debug_msg"].clone(); + Ok(Self::Err(JSONError { + code, + msg, + debug_msg: if debug_msg.is_null() { + None + } else { + Some(debug_msg) + }, + })) + } + } +} diff --git a/src/server/unittest/auth.rs b/src/server/unittest/auth.rs index f0211a4..e5a3d9e 100644 --- a/src/server/unittest/auth.rs +++ b/src/server/unittest/auth.rs @@ -1,7 +1,13 @@ use super::UnitTestContext; use crate::error::PixivDownloaderError; +use crate::ext::json::FromJson; +use crate::server::result::JSONResult; use bytes::BytesMut; use hyper::{Body, Request}; +use openssl::{ + pkey::Public, + rsa::{Padding, Rsa}, +}; /// Test authentification methods /// Returns token @@ -11,9 +17,28 @@ pub async fn test(ctx: &UnitTestContext) -> Result "test", + "name" => "test", + "password" => b64_password, + }, + ) + .await? + .unwrap(); + let result = JSONResult::from_json(re)?.expect("Failed to add user:"); Ok(BytesMut::new()) } diff --git a/src/server/unittest/mod.rs b/src/server/unittest/mod.rs index 8516c59..b769b6f 100644 --- a/src/server/unittest/mod.rs +++ b/src/server/unittest/mod.rs @@ -61,6 +61,52 @@ impl UnitTestContext { None => None, }) } + + pub async fn request_json2( + &self, + uri: &str, + params: &JsonValue, + ) -> Result, PixivDownloaderError> { + let mut par = Vec::new(); + for (key, obj) in params.entries() { + if let Some(s) = obj.as_str() { + par.push(format!( + "{}={}", + urlparse::quote_plus(key, b"")?, + urlparse::quote_plus(s, b"")? + )); + } else if obj.is_array() { + for s in obj.members() { + if let Some(s) = s.as_str() { + par.push(format!( + "{}={}", + urlparse::quote_plus(key, b"")?, + urlparse::quote_plus(s, b"")? + )); + } else { + par.push(format!( + "{}={}", + urlparse::quote_plus(key, b"")?, + urlparse::quote_plus(&(s.dump()), b"")? + )); + } + } + } else { + par.push(format!( + "{}={}", + urlparse::quote_plus(key, b"")?, + urlparse::quote_plus(&(obj.dump()), b"")? + )); + } + } + let par = par.join("&"); + let req = Request::builder() + .method("POST") + .uri(uri) + .header("Content-Type", "application/x-www-form-urlencoded") + .body(Body::from(par))?; + self.request_json(req).await + } } #[proc_macros::async_timeout_test(120s)]