Skip to content

Commit

Permalink
Split NotionApi tests out
Browse files Browse the repository at this point in the history
  • Loading branch information
jakeswenson committed Aug 29, 2021
1 parent 1c22088 commit a78a8d9
Show file tree
Hide file tree
Showing 2 changed files with 165 additions and 168 deletions.
172 changes: 4 additions & 168 deletions src/lib.rs
@@ -1,4 +1,5 @@
use crate::ids::{BlockId, DatabaseId};
use crate::models::error::ErrorResponse;
use crate::models::search::{DatabaseQuery, SearchRequest};
use crate::models::{Block, Database, ListResponse, Object, Page};
use ids::AsIdentifier;
Expand All @@ -7,10 +8,11 @@ use reqwest::{header, Client, ClientBuilder, RequestBuilder};

pub mod ids;
pub mod models;

use crate::models::error::ErrorResponse;
pub use chrono;

#[cfg(test)]
mod tests;

const NOTION_API_VERSION: &str = "2021-08-16";

/// An wrapper Error type for all errors produced by the [`NotionApi`](NotionApi) client.
Expand Down Expand Up @@ -198,169 +200,3 @@ impl NotionApi {
}
}
}

#[cfg(test)]
mod tests {
use crate::ids::BlockId;
use crate::models::search::PropertyCondition::Text;
use crate::models::search::{
DatabaseQuery, FilterCondition, FilterProperty, FilterValue, NotionSearch, TextCondition,
};
use crate::models::Object;
use crate::NotionApi;

fn test_token() -> String {
let token = {
if let Some(token) = std::env::var("NOTION_API_TOKEN").ok() {
token
} else if let Some(token) = std::fs::read_to_string(".api_token").ok() {
token
} else {
panic!("No API Token found in environment variable 'NOTION_API_TOKEN'!")
}
};
token.trim().to_string()
}

fn test_client() -> NotionApi {
std::env::set_var("RUST_LOG", "notion");
NotionApi::new(test_token()).unwrap()
}

#[tokio::test]
async fn list_databases() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

dbg!(api.list_databases().await?);

Ok(())
}

#[tokio::test]
async fn search_databases() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

let response = api
.search(NotionSearch::Filter {
property: FilterProperty::Object,
value: FilterValue::Database,
})
.await?;

assert!(response.results.len() > 0);

Ok(())
}

#[tokio::test]
async fn search_pages() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

let response = api
.search(NotionSearch::Filter {
property: FilterProperty::Object,
value: FilterValue::Page,
})
.await?;

assert!(response.results.len() > 0);

Ok(())
}

#[tokio::test]
async fn get_database() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

let response = api
.search(NotionSearch::Filter {
value: FilterValue::Database,
property: FilterProperty::Object,
})
.await?;

let db = response
.results()
.iter()
.filter_map(|o| match o {
Object::Database { database } => Some(database),
_ => None,
})
.next()
.expect("Test expected to find at least one database in notion")
.clone();

// todo: fix this clone issue
let db_result = api.get_database(db.clone()).await?;

assert_eq!(db, db_result);

Ok(())
}

#[tokio::test]
async fn get_block_children() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

let search_response = api
.search(NotionSearch::Filter {
value: FilterValue::Page,
property: FilterProperty::Object,
})
.await?;

println!("{:?}", search_response.results.len());

for object in search_response.results {
match object {
Object::Page { page } => api
.get_block_children(BlockId::from(page.id))
.await
.unwrap(),
_ => panic!("Should not have received anything but pages!"),
};
}

Ok(())
}

#[tokio::test]
async fn query_database() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

let response = api
.search(NotionSearch::Filter {
value: FilterValue::Database,
property: FilterProperty::Object,
})
.await?;

let db = response
.results()
.iter()
.filter_map(|o| match o {
Object::Database { database } => Some(database),
_ => None,
})
.next()
.expect("Test expected to find at least one database in notion")
.clone();

let pages = api
.query_database(
db,
DatabaseQuery {
filter: Some(FilterCondition {
property: "Name".to_string(),
condition: Text(TextCondition::Contains("First".to_string())),
}),
..Default::default()
},
)
.await?;

assert_eq!(pages.results().len(), 1);

Ok(())
}
}
161 changes: 161 additions & 0 deletions src/tests.rs
@@ -0,0 +1,161 @@
use crate::ids::BlockId;
use crate::models::search::PropertyCondition::Text;
use crate::models::search::{
DatabaseQuery, FilterCondition, FilterProperty, FilterValue, NotionSearch, TextCondition,
};
use crate::models::Object;
use crate::NotionApi;

fn test_token() -> String {
let token = {
if let Some(token) = std::env::var("NOTION_API_TOKEN").ok() {
token
} else if let Some(token) = std::fs::read_to_string(".api_token").ok() {
token
} else {
panic!("No API Token found in environment variable 'NOTION_API_TOKEN'!")
}
};
token.trim().to_string()
}

fn test_client() -> NotionApi {
NotionApi::new(test_token()).unwrap()
}

#[tokio::test]
async fn list_databases() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

dbg!(api.list_databases().await?);

Ok(())
}

#[tokio::test]
async fn search_databases() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

let response = api
.search(NotionSearch::Filter {
property: FilterProperty::Object,
value: FilterValue::Database,
})
.await?;

assert!(response.results.len() > 0);

Ok(())
}

#[tokio::test]
async fn search_pages() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

let response = api
.search(NotionSearch::Filter {
property: FilterProperty::Object,
value: FilterValue::Page,
})
.await?;

assert!(response.results.len() > 0);

Ok(())
}

#[tokio::test]
async fn get_database() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

let response = api
.search(NotionSearch::Filter {
value: FilterValue::Database,
property: FilterProperty::Object,
})
.await?;

let db = response
.results()
.iter()
.filter_map(|o| match o {
Object::Database { database } => Some(database),
_ => None,
})
.next()
.expect("Test expected to find at least one database in notion")
.clone();

// todo: fix this clone issue
let db_result = api.get_database(db.clone()).await?;

assert_eq!(db, db_result);

Ok(())
}

#[tokio::test]
async fn get_block_children() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

let search_response = api
.search(NotionSearch::Filter {
value: FilterValue::Page,
property: FilterProperty::Object,
})
.await?;

println!("{:?}", search_response.results.len());

for object in search_response.results {
match object {
Object::Page { page } => api
.get_block_children(BlockId::from(page.id))
.await
.unwrap(),
_ => panic!("Should not have received anything but pages!"),
};
}

Ok(())
}

#[tokio::test]
async fn query_database() -> Result<(), Box<dyn std::error::Error>> {
let api = test_client();

let response = api
.search(NotionSearch::Filter {
value: FilterValue::Database,
property: FilterProperty::Object,
})
.await?;

let db = response
.results()
.iter()
.filter_map(|o| match o {
Object::Database { database } => Some(database),
_ => None,
})
.next()
.expect("Test expected to find at least one database in notion")
.clone();

let pages = api
.query_database(
db,
DatabaseQuery {
filter: Some(FilterCondition {
property: "Name".to_string(),
condition: Text(TextCondition::Contains("First".to_string())),
}),
..Default::default()
},
)
.await?;

assert_eq!(pages.results().len(), 1);

Ok(())
}

0 comments on commit a78a8d9

Please sign in to comment.