uprs 0.1.0

A wrapper for the Up Bank API.
Documentation
#[cfg(test)]
mod tests {
    use chrono::{DateTime, FixedOffset};
    use serde_json::json;
    use std::collections::HashMap;
    use std::fs;
    use uprs::models::*;
    use uprs::request_sender::ApiResponse;

    #[tokio::test]
    async fn account_deserialization() {
        let json: String = fs::read_to_string("tests/example_json/list_accounts.json").unwrap();
        let des: ApiResponse<Vec<Account>> = serde_json::from_str(&*json).unwrap();

        assert_eq!(
            des,
            ApiResponse {
               data: vec![
                   Account {
                       resource_type: "accounts".to_string(),
                       id: "1bcc9d36-ccdf-457d-9e40-cecde788abb4".to_string(),
                       attributes: AccountAttributes {
                           display_name: "Spending".to_string(),
                           account_type: AccountType::Transactional,
                           ownership_type: OwnershipType::Individual,
                           balance: Money {
                               currency_code: "AUD".to_string(),
                               value: "1.00".to_string(),
                               value_in_base_units: 100
                           },
                           created_at: DateTime::<FixedOffset>::parse_from_rfc3339("2022-07-05T17:52:25+10:00")
                               .unwrap()
                       },
                       relationships: AccountRelationships {
                           transactions: AccountTransactionsRelationships {
                               links: HashMap::<String, String>::from([("related".to_string(), "https://api.up.com.au/api/v1/accounts/1bcc9d36-ccdf-457d-9e40-cecde788abb4/transactions".to_string())])
                           }
                       },
                       links: HashMap::<String, String>::from([("self".to_string(), "https://api.up.com.au/api/v1/accounts/1bcc9d36-ccdf-457d-9e40-cecde788abb4".to_string())])
                   }
                ],
                links: Some(HashMap::<String, Option<String>>::from([
                    ("prev".to_string(), None),
                    ("next".to_string(), Some("https://api.up.com.au/api/v1/accounts?page%5Bafter%5D=WyIyMDIyLTA3LTA1VDA3OjUyOjI1LjI5NDU0NjAwMFoiLCIxYmNjOWQzNi1jY2RmLTQ1N2QtOWU0MC1jZWNkZTc4OGFiYjQiXQ%3D%3D&page%5Bsize%5D=1".to_string()))
                ]))
            }
        )
    }

    #[tokio::test]
    async fn category_deserialization() {
        let json: String = fs::read_to_string("tests/example_json/list_categories.json").unwrap();
        let des: ApiResponse<Vec<Category>> = serde_json::from_str(&*json).unwrap();

        assert_eq!(
            des,
            ApiResponse {
                data: vec![
                        Category {
                            resource_type: "categories".to_string(),
                            id: "hobbies".to_string(),
                            attributes: CategoryAttributes {
                                name: "Hobbies".to_string()
                            },
                            relationships: CategoryRelationships {
                                parent: ParentRelationship {
                                    data: Some(HashMap::<String, String>::from([
                                        ("id".to_string(), "good-life".to_string()),
                                        ("type".to_string(), "categories".to_string())
                                    ])),
                                    links: Some(HashMap::<String, String>::from([
                                        ("related".to_string(), "https://api.up.com.au/api/v1/categories/good-life".to_string())
                                    ])),
                                },
                                children: ChildRelationship {
                                    data: Some(vec![]),
                                    links: Some(HashMap::<String, String>::from([
                                        ("related".to_string(), "https://api.up.com.au/api/v1/categories?filter%5Bparent%5D=hobbies".to_string())
                                    ])),
                                }
                            },
                            links: Some(HashMap::<String, String>::from([
                                ("self".to_string(), "https://api.up.com.au/api/v1/categories/hobbies".to_string())
                            ])),
                    },
                    Category {
                        resource_type: "categories".to_string(),
                        id: "restaurants-and-cafes".to_string(),
                        attributes: CategoryAttributes {
                            name: "Restaurants & Cafes".to_string()
                        },
                        relationships: CategoryRelationships {
                            parent: ParentRelationship {
                                data: Some(HashMap::<String, String>::from([
                                    ("type".to_string(), "categories".to_string()),
                                    ("id".to_string(), "good-life".to_string())
                                ])),
                                links: Some(HashMap::<String, String>::from([
                                    ("related".to_string(), "https://api.up.com.au/api/v1/categories/good-life".to_string())
                                ])),
                            },
                            children: ChildRelationship {
                                data: Some(vec![]),
                                links: Some(HashMap::<String, String>::from([
                                    ("related".to_string(), "https://api.up.com.au/api/v1/categories?filter%5Bparent%5D=restaurants-and-cafes".to_string())
                                ])),
                            }
                        },
                        links: Some(HashMap::<String, String>::from([
                            ("self".to_string(), "https://api.up.com.au/api/v1/categories/restaurants-and-cafes".to_string())
                        ])),
                    },
                ],
                links: None
            }
        )
    }

    #[tokio::test]
    async fn tag_deserialization() {
        let json: String = fs::read_to_string("tests/example_json/list_tags.json").unwrap();
        let des: ApiResponse<Vec<Tag>> = serde_json::from_str(&*json).unwrap();

        assert_eq!(
            des,
            ApiResponse { data: vec![
                Tag {
                    resource_type: "tags".to_string(),
                    id: "Holiday".to_string(),
                    relationships: TagRelationships { transactions: TagTransactionRelationships { links: HashMap::<String, String>::from([
                        ("related".to_string(), "https://api.up.com.au/api/v1/transactions?filter%5Btag%5D=Holiday".to_string())
                    ]) } }
                },
                Tag {
                    resource_type: "tags".to_string(),
                    id: "Pizza Night".to_string(),
                    relationships: TagRelationships { transactions: TagTransactionRelationships { links: HashMap::<String, String>::from([
                        ("related".to_string(), "https://api.up.com.au/api/v1/transactions?filter%5Btag%5D=Pizza+Night".to_string())
                    ]) } }
                }
            ], links: Some(HashMap::<String, Option<String>>::from([
                ("prev".to_string(), None),
                ("next".to_string(), Some("https://api.up.com.au/api/v1/tags?page%5Bafter%5D=WyJQaXp6YSBOaWdodCJd&page%5Bsize%5D=2".to_string()))
                ])) }
        )
    }

    #[tokio::test]
    async fn transaction_deserialization() {
        let json: String = fs::read_to_string("tests/example_json/list_transactions.json").unwrap();
        let des: ApiResponse<Vec<Transaction>> = serde_json::from_str(&*json).unwrap();

        assert_eq!(
            des,
            ApiResponse {
                data: vec![Transaction {
                    resource_type: "transactions".to_string(),
                    id: "13a25bb2-7290-43ce-a9e8-c9901c58895d".to_string(),
                    attributes: TransactionAttributes {
                        status: TransactionStatus::Settled,
                        raw_text: None,
                        description: "David Taylor".to_string(),
                        message: Some("Money for the pizzas last night.".to_string()),
                        is_categorizable: true,
                        hold_info: None,
                        round_up: None,
                        cashback: None,
                        amount: Money {
                            currency_code: "AUD".to_string(),
                            value: "-59.98".to_string(),
                            value_in_base_units: -5998
                        },
                        foreign_amount: None,
                        card_purchase_method: None,
                        settled_at: Some(
                            DateTime::<FixedOffset>::parse_from_rfc3339(
                                "2022-07-07T05:20:36+10:00"
                            )
                            .unwrap()
                        ),
                        created_at: DateTime::<FixedOffset>::parse_from_rfc3339(
                            "2022-07-07T05:20:36+10:00"
                        )
                        .unwrap()
                    },
                    relationships: TransactionRelationships {
                        account: TransactionAccountRelationship {
                            data: TransactionAccountRelationshipData {
                                resource_type: "accounts".to_string(),
                                id: "0707a248-76c7-4fb8-8858-18b6489fded3".to_string()
                            },
                            links: Some(HashMap::<String, String>::from([
                                ("related".to_string(), "https://api.up.com.au/api/v1/accounts/0707a248-76c7-4fb8-8858-18b6489fded3".to_string())
                            ]))
                        },
                        transfer_account: TransactionTransferAccountRelationship {
                            data: None,
                            links: None
                        },
                        category: TransactionCategoryRelationship {
                            data: None,
                            links: Some(HashMap::<String, String>::from([
                                ("self".to_string(), "https://api.up.com.au/api/v1/transactions/13a25bb2-7290-43ce-a9e8-c9901c58895d/relationships/category".to_string())
                            ]))
                        },
                        parent_category: TransactionCategoryRelationship {
                            data: None,
                            links: None
                        },
                        tags: TransactionTagsRelationship {
                            data: vec![
                                TransactionTagsRelationshipData { resource_type: "tags".to_string(), id: "Pizza Night".to_string() }
                            ],
                            links: Some(HashMap::<String, String>::from([
                                ("self".to_string(), "https://api.up.com.au/api/v1/transactions/13a25bb2-7290-43ce-a9e8-c9901c58895d/relationships/tags".to_string())
                            ]))
                        }
                    },
                    links: Some(HashMap::<String, String>::from([
                        ("self".to_string(), "https://api.up.com.au/api/v1/transactions/13a25bb2-7290-43ce-a9e8-c9901c58895d".to_string())
                    ]))
                }],
                links: Some(HashMap::<String, Option<String>>::from([
                    ("prev".to_string(), None),
                    ("next".to_string(), None)
                ]))
            }
        )
    }
}