Register function with good errors!
This commit is contained in:
parent
c6ded56510
commit
1bdf202745
|
@ -1,11 +1,11 @@
|
||||||
pub mod register {
|
pub mod register {
|
||||||
use reqwest::Client;
|
use reqwest::Client;
|
||||||
use serde_json::{from_str, json};
|
use serde_json::{from_str, json, Value};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
api::{
|
api::{
|
||||||
limits::LimitType,
|
limits::LimitType,
|
||||||
schemas::schemas::{ErrorBody, RegisterSchema},
|
schemas::schemas::{ErrorResponse, RegisterSchema},
|
||||||
},
|
},
|
||||||
errors::InstanceServerError,
|
errors::InstanceServerError,
|
||||||
instance::{Instance, Token},
|
instance::{Instance, Token},
|
||||||
|
@ -39,19 +39,19 @@ pub mod register {
|
||||||
let status = response_unwrap.status();
|
let status = response_unwrap.status();
|
||||||
let response_text_string = response_unwrap.text().await.unwrap();
|
let response_text_string = response_unwrap.text().await.unwrap();
|
||||||
if status.is_client_error() {
|
if status.is_client_error() {
|
||||||
let error: ErrorBody = from_str(&response_text_string).unwrap();
|
let json: ErrorResponse = serde_json::from_str(&response_text_string).unwrap();
|
||||||
return Err(InstanceServerError::InvalidFormBodyError {
|
let error_type = json.errors.errors.iter().next().unwrap().0.to_owned();
|
||||||
error: error.errors.errors.iter().next().unwrap().code.clone(),
|
let mut error = "".to_string();
|
||||||
});
|
for (_, value) in json.errors.errors.iter() {
|
||||||
|
for error_item in value._errors.iter() {
|
||||||
|
error += &(error_item.message.to_string() + " (" + &error_item.code + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Err(InstanceServerError::InvalidFormBodyError { error_type, error });
|
||||||
}
|
}
|
||||||
return Ok(Token {
|
return Ok(Token {
|
||||||
token: response_text_string,
|
token: response_text_string,
|
||||||
});
|
});
|
||||||
|
|
||||||
/*
|
|
||||||
Things to do:
|
|
||||||
Check out the serde error. Maybe make a seperate project to find out how flatten works
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,9 +59,43 @@ pub mod register {
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use crate::api::schemas::schemas::RegisterSchema;
|
use crate::api::schemas::schemas::RegisterSchema;
|
||||||
|
use crate::errors::InstanceServerError;
|
||||||
use crate::instance::Instance;
|
use crate::instance::Instance;
|
||||||
use crate::limit::LimitedRequester;
|
use crate::limit::LimitedRequester;
|
||||||
use crate::URLBundle;
|
use crate::URLBundle;
|
||||||
|
#[tokio::test]
|
||||||
|
async fn test_incomplete_registration() {
|
||||||
|
let urls = URLBundle::new(
|
||||||
|
"http://localhost:3001/api".to_string(),
|
||||||
|
"http://localhost:3001".to_string(),
|
||||||
|
"http://localhost:3001".to_string(),
|
||||||
|
);
|
||||||
|
let limited_requester = LimitedRequester::new(urls.get_api().to_string()).await;
|
||||||
|
let mut test_instance = Instance::new(urls.clone(), limited_requester)
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
let reg = RegisterSchema::new(
|
||||||
|
"aaa".to_string(),
|
||||||
|
None,
|
||||||
|
true,
|
||||||
|
Some("me@mail.xy".to_string()),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
InstanceServerError::InvalidFormBodyError {
|
||||||
|
error_type: "date_of_birth".to_string(),
|
||||||
|
error: "This field is required (BASE_TYPE_REQUIRED)".to_string()
|
||||||
|
},
|
||||||
|
test_instance.register(®).await.err().unwrap()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn test_registration() {
|
async fn test_registration() {
|
||||||
let urls = URLBundle::new(
|
let urls = URLBundle::new(
|
||||||
|
@ -74,18 +108,19 @@ mod test {
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let reg = RegisterSchema::new(
|
let reg = RegisterSchema::new(
|
||||||
"Test".to_string(),
|
"Hiiii".to_string(),
|
||||||
None,
|
Some("mysupersecurepass123!".to_string()),
|
||||||
true,
|
true,
|
||||||
Some("me@mail.xy".to_string()),
|
Some("flori@mail.xyz".to_string()),
|
||||||
None,
|
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
|
Some("2000-01-01".to_string()),
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
println!("{}", test_instance.register(®).await.unwrap());
|
let token = test_instance.register(®).await.unwrap().token;
|
||||||
|
println!("{}", token);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -151,19 +151,26 @@ pub mod schemas {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct ErrorBody {
|
pub struct ErrorResponse {
|
||||||
code: i32,
|
pub code: i32,
|
||||||
pub message: String,
|
pub message: String,
|
||||||
pub errors: ErrorObject,
|
pub errors: IntermittentError,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct ErrorObject {
|
pub struct IntermittentError {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub errors: Vec<Error>,
|
pub errors: std::collections::HashMap<String, ErrorField>,
|
||||||
}
|
}
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Default)]
|
||||||
|
pub struct ErrorField {
|
||||||
|
#[serde(default)]
|
||||||
|
pub _errors: Vec<Error>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct Error {
|
pub struct Error {
|
||||||
pub message: String,
|
pub message: String,
|
||||||
pub code: String,
|
pub code: String,
|
||||||
|
|
|
@ -16,5 +16,5 @@ custom_error! {
|
||||||
RequestErrorError{url:String, error:String} = "An error occured while trying to GET from {url}: {error}",
|
RequestErrorError{url:String, error:String} = "An error occured while trying to GET from {url}: {error}",
|
||||||
ReceivedErrorCodeError{error_code:String} = "Received the following error code while requesting from the route: {error_code}",
|
ReceivedErrorCodeError{error_code:String} = "Received the following error code while requesting from the route: {error_code}",
|
||||||
CantGetInfoError{error:String} = "Something seems to be wrong with the instance. Cannot get information about the instance: {error}",
|
CantGetInfoError{error:String} = "Something seems to be wrong with the instance. Cannot get information about the instance: {error}",
|
||||||
InvalidFormBodyError{error:String} = "The server responded with: {error}",
|
InvalidFormBodyError{error_type: String, error:String} = "The server responded with: {error_type}: {error}",
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue