use reqwest::Method;
use drive_v3_macros::{DriveRequestBuilder, request};
use super::DriveRequestBuilder;
use crate::{objects, Credentials};
#[request(
method=Method::POST,
url="https://www.googleapis.com/drive/v3/files/{file_id}/comments",
returns=objects::Comment,
)]
#[derive(DriveRequestBuilder)]
pub struct CreateRequest {
#[drive_v3(body)]
comment: Option<objects::Comment>
}
#[request(
method=Method::DELETE,
url="https://www.googleapis.com/drive/v3/files/{file_id}/comments/{comment_id}",
returns=(),
)]
#[derive(DriveRequestBuilder)]
pub struct DeleteRequest {}
#[request(
method=Method::GET,
url="https://www.googleapis.com/drive/v3/files/{file_id}/comments/{comment_id}",
returns=objects::Comment,
)]
#[derive(DriveRequestBuilder)]
pub struct GetRequest {
#[drive_v3(parameter)]
include_deleted: Option<bool>
}
#[request(
method=Method::GET,
url="https://www.googleapis.com/drive/v3/files/{file_id}/comments",
returns=objects::CommentList,
)]
#[derive(DriveRequestBuilder)]
pub struct ListRequest {
#[drive_v3(parameter)]
include_deleted: Option<bool>,
#[drive_v3(parameter)]
page_size: Option<i64>,
#[drive_v3(parameter)]
page_token: Option<String>,
#[drive_v3(parameter)]
start_modified_time: Option<String>,
}
#[request(
method=Method::PATCH,
url="https://www.googleapis.com/drive/v3/files/{file_id}/comments/{comment_id}",
returns=objects::Comment,
)]
#[derive(DriveRequestBuilder)]
pub struct UpdateRequest {
#[drive_v3(body)]
comment: Option<objects::Comment>
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Comments {
credentials: Credentials,
}
impl Comments {
pub fn new( credentials: &Credentials ) -> Self {
Self { credentials: credentials.clone() }
}
pub fn create<T: AsRef<str>> ( &self, file_id: T ) -> CreateRequest {
CreateRequest::new(&self.credentials, file_id)
}
pub fn delete<T, U> ( &self, file_id: T, comment_id: U ) -> DeleteRequest
where
T: AsRef<str>,
U: AsRef<str>
{
DeleteRequest::new(&self.credentials, file_id, comment_id)
}
pub fn get<T, U> ( &self, file_id: T, comment_id: U ) -> GetRequest
where
T: AsRef<str>,
U: AsRef<str>
{
GetRequest::new(&self.credentials, file_id, comment_id)
}
pub fn list<T: AsRef<str>> ( &self, file_id: T ) -> ListRequest {
ListRequest::new(&self.credentials, file_id)
}
pub fn update<T, U> ( &self, file_id: T, comment_id: U ) -> UpdateRequest
where
T: AsRef<str>,
U: AsRef<str>
{
UpdateRequest::new(&self.credentials, file_id, comment_id)
}
}
#[cfg(test)]
mod tests {
use super::Comments;
use crate::{ErrorKind, objects, resources};
use crate::utils::test::{INVALID_CREDENTIALS, VALID_CREDENTIALS};
fn get_resource() -> Comments {
Comments::new(&VALID_CREDENTIALS)
}
fn get_invalid_resource() -> Comments {
Comments::new(&INVALID_CREDENTIALS)
}
fn get_files_resource() -> resources::Files {
resources::Files::new(&VALID_CREDENTIALS)
}
fn delete_file( file: &objects::File ) -> crate::Result<()> {
get_files_resource().delete( file.clone().id.unwrap() ).execute()
}
fn get_test_file_metadata() -> objects::File {
objects::File {
name: Some( "test.txt".to_string() ),
description: Some( "a test file".to_string() ),
mime_type: Some( "text/plain".to_string() ),
..Default::default()
}
}
fn get_test_drive_file() -> crate::Result<objects::File> {
let metadata = get_test_file_metadata();
get_files_resource().create()
.fields("*")
.upload_type(objects::UploadType::Multipart)
.metadata(&metadata)
.content_string("content")
.execute()
}
fn get_test_comment() -> objects::Comment {
objects::Comment {
content: Some( "test comment".to_string() ),
..Default::default()
}
}
fn get_test_drive_comment( file: &objects::File ) -> crate::Result<objects::Comment> {
let test_comment = get_test_comment();
get_resource().create( &file.clone().id.unwrap() )
.fields("*")
.comment(&test_comment)
.execute()
}
#[test]
fn new_test() {
let valid_resource = get_resource();
let invalid_resource = get_invalid_resource();
assert_eq!( valid_resource.credentials, VALID_CREDENTIALS.clone() );
assert_eq!( invalid_resource.credentials, INVALID_CREDENTIALS.clone() );
}
#[test]
fn create_test() {
let test_drive_file = get_test_drive_file().unwrap();
let test_comment = get_test_comment();
let response = get_resource().create( &test_drive_file.clone().id.unwrap() )
.fields("*")
.comment(&test_comment)
.execute();
assert!( response.is_ok() );
let comment = response.unwrap();
assert_eq!(comment.content, test_comment.content);
delete_file(&test_drive_file).expect("Failed to cleanup created file");
}
#[test]
fn create_invalid_test() {
let response = get_invalid_resource().create("invalid-id")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn delete_test() {
let test_drive_file = get_test_drive_file().unwrap();
let test_drive_comment = get_test_drive_comment(&test_drive_file).unwrap();
let response = get_resource().delete(
&test_drive_file.clone().id.unwrap(),
&test_drive_comment.clone().id.unwrap(),
)
.execute();
assert!( response.is_ok() );
delete_file(&test_drive_file).expect("Failed to cleanup created file");
}
#[test]
fn delete_invalid_test() {
let response = get_invalid_resource().delete("invalid-id", "invalid-id")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn get_test() {
let test_drive_file = get_test_drive_file().unwrap();
let test_drive_comment = get_test_drive_comment(&test_drive_file).unwrap();
let response = get_resource().get(
&test_drive_file.clone().id.unwrap(),
&test_drive_comment.clone().id.unwrap(),
)
.fields("*")
.execute();
assert!( response.is_ok() );
let comment = response.unwrap();
assert_eq!(comment, test_drive_comment);
delete_file(&test_drive_file).expect("Failed to cleanup created file");
}
#[test]
fn get_invalid_test() {
let response = get_invalid_resource().get("invalid-id", "invalid-id")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn list_test() {
let test_drive_file = get_test_drive_file().unwrap();
let test_drive_comment = get_test_drive_comment(&test_drive_file).unwrap();
let response = get_resource().list( &test_drive_file.clone().id.unwrap() )
.fields("*")
.execute();
assert!( response.is_ok() );
let comment_list = response.unwrap();
assert_eq!( comment_list.comments, Some(vec![test_drive_comment]) );
delete_file(&test_drive_file).expect("Failed to cleanup created file");
}
#[test]
fn list_invalid_test() {
let response = get_invalid_resource().list("invalid-id")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
#[test]
fn update_test() {
let test_drive_file = get_test_drive_file().unwrap();
let test_drive_comment = get_test_drive_comment(&test_drive_file).unwrap();
let mut updated_comment = test_drive_comment.clone();
updated_comment.content = Some( "updated comment".to_string() );
let response = get_resource().update(
&test_drive_file.clone().id.unwrap(),
&test_drive_comment.clone().id.unwrap(),
)
.fields("*")
.comment(&updated_comment)
.execute();
assert!( response.is_ok() );
let comment = response.unwrap();
assert_eq!(comment.content, updated_comment.content);
delete_file(&test_drive_file).expect("Failed to cleanup created file");
}
#[test]
fn update_invalid_test() {
let response = get_invalid_resource().update("invalid-id", "invalid-id")
.execute();
assert!( response.is_err() );
assert_eq!( response.unwrap_err().kind, ErrorKind::Response );
}
}