#[cfg(feature = "mock")] mod integration { use chrono::prelude::*; use edn_derive::Serialize; use mockito::mock; use transistor::client::Crux; use transistor::types::http::TimeHistory; use transistor::types::http::{ActionMock, Actions, Order}; use transistor::types::CruxId; #[test] fn mock_client() { let _m = mock("POST", "/tx-log") .with_status(200) .match_body("[[:crux.tx/put { :crux.db/id :jorge-3, :first-name \"Michael\", :last-name \"Jorge\", }], [:crux.tx/put { :crux.db/id :manuel-1, :first-name \"Diego\", :last-name \"Manuel\", }]]") .with_header("content-type", "text/plain") .with_body("{:crux.tx/tx-id 8, :crux.tx/tx-time #inst \"2020-07-16T21:53:14.628-00:00\"}") .create(); let body = Crux::new("localhost", "3000") .http_mock() .tx_log(actions()) .unwrap(); assert_eq!( format!("{:?}", body), String::from("TxLogResponse { tx___tx_id: 8, tx___tx_time: 2020-07-16T21:53:14.628+00:00, tx__event___tx_events: None }") ); } #[test] fn chrono() { let _m = mock("POST", "/tx-log") .with_status(200) .match_body("[[:crux.tx/put { :crux.db/id :jorge-3, :first-name \"Michael\", :last-name \"Jorge\", }], [:crux.tx/put { :crux.db/id :manuel-1, :first-name \"Diego\", :last-name \"Manuel\", }]]") .with_header("content-type", "text/plain") .with_body("{:crux.tx/tx-id 8, :crux.tx/tx-time #inst \"2020-07-16T21:53:14.628-00:00\"}") .create(); let body = Crux::new("localhost", "3000") .http_mock() .tx_log(actions()) .unwrap(); assert_eq!( body.tx___tx_time, "2020-07-16T21:53:14.628-00:00" .parse::>() .unwrap() ); } #[test] fn entity_history() { let expected_body = "({:crux.tx/tx-time \"2020-07-19T04:12:13.788-00:00\", :crux.tx/tx-id 28, :crux.db/valid-time \"2020-07-19T04:12:13.788-00:00\", :crux.db/content-hash \"1828ebf4466f98ea3f5252a58734208cd0414376\"})"; let _m = mock("GET", "/entity-history/ecc6475b7ef9acf689f98e479d539e869432cb5e?sort-order=asc&with-docs=false") .with_status(200) .with_header("content-type", "application/edn") .with_body(expected_body) .create(); let body = Crux::new("localhost", "3000") .http_mock() .entity_history( "ecc6475b7ef9acf689f98e479d539e869432cb5e".to_string(), Order::Asc, false, ) .unwrap(); let actual = format!("{:?}", body); let expected = "EntityHistoryResponse { history: [EntityHistoryElement { db___valid_time: 2020-07-19T04:12:13.788+00:00, tx___tx_id: 28, tx___tx_time: 2020-07-19T04:12:13.788+00:00, db___content_hash: \"1828ebf4466f98ea3f5252a58734208cd0414376\", db__doc: None }] }"; assert_eq!(actual, expected); } #[test] fn entity_tx() { let expected_body = "{:crux.db/id \"d72ccae848ce3a371bd313865cedc3d20b1478ca\", :crux.db/content-hash \"1828ebf4466f98ea3f5252a58734208cd0414376\", :crux.db/valid-time #inst \"2020-07-19T04:12:13.788-00:00\", :crux.tx/tx-time #inst \"2020-07-19T04:12:13.788-00:00\", :crux.tx/tx-id 28}"; let _m = mock("POST", "/entity-tx") .with_status(200) .match_body("{:eid :ivan}") .with_header("content-type", "application/edn") .with_body(expected_body) .create(); let id = CruxId::new(":ivan"); let body = Crux::new("localhost", "3000") .http_mock() .entity_tx(id) .unwrap(); let actual = format!("{:?}", body); let expected = "EntityTxResponse { db___id: \"d72ccae848ce3a371bd313865cedc3d20b1478ca\", db___content_hash: \"1828ebf4466f98ea3f5252a58734208cd0414376\", db___valid_time: 2020-07-19T04:12:13.788+00:00, tx___tx_id: 28, tx___tx_time: 2020-07-19T04:12:13.788+00:00 }"; assert_eq!(actual, expected); } #[test] fn match_tx_date_times() { let date = "2014-11-28T21:00:09+09:00" .parse::>() .unwrap(); let m = mock("GET", "/entity-history/ecc6475b7ef9acf689f98e479d539e869432cb5e?sort-order=asc&with-docs=false&start-transaction-time=2014-11-28T12:00:09&end-transaction-time=2014-11-28T12:00:09") .create(); let _ = Crux::new("localhost", "3000") .http_mock() .entity_history_timed( "ecc6475b7ef9acf689f98e479d539e869432cb5e".to_string(), Order::Asc, false, vec![TimeHistory::TransactionTime(Some(date), Some(date))], ); m.assert(); } #[test] fn match_tx_end_date() { let date = "2014-11-28T21:00:09+09:00" .parse::>() .unwrap(); let m = mock("GET", "/entity-history/ecc6475b7ef9acf689f98e479d539e869432cb5e?sort-order=asc&with-docs=false&end-transaction-time=2014-11-28T12:00:09") .create(); let _ = Crux::new("localhost", "3000") .http_mock() .entity_history_timed( "ecc6475b7ef9acf689f98e479d539e869432cb5e".to_string(), Order::Asc, false, vec![TimeHistory::TransactionTime(None, Some(date))], ); m.assert(); } #[test] fn match_valid_start_date() { let date = "2014-11-28T21:00:09+09:00" .parse::>() .unwrap(); let m = mock("GET", "/entity-history/ecc6475b7ef9acf689f98e479d539e869432cb5e?sort-order=asc&with-docs=false&start-valid-time=2014-11-28T12:00:09") .create(); let _ = Crux::new("localhost", "3000") .http_mock() .entity_history_timed( "ecc6475b7ef9acf689f98e479d539e869432cb5e".to_string(), Order::Asc, false, vec![TimeHistory::ValidTime(Some(date), None)], ); m.assert(); } #[test] fn match_none_date() { let m = mock("GET", "/entity-history/ecc6475b7ef9acf689f98e479d539e869432cb5e?sort-order=asc&with-docs=false") .create(); let _ = Crux::new("localhost", "3000") .http_mock() .entity_history_timed( "ecc6475b7ef9acf689f98e479d539e869432cb5e".to_string(), Order::Asc, false, vec![TimeHistory::ValidTime(None, None)], ); m.assert(); } #[test] fn test_actions_eq_actions_mock() { let actions = test_actions(); let mock = test_action_mock(); assert_eq!(actions, mock); } fn test_action_mock() -> Vec { let person1 = Person { crux__db___id: CruxId::new("jorge-3"), first_name: "Michael".to_string(), last_name: "Jorge".to_string(), }; let person2 = Person { crux__db___id: CruxId::new("manuel-1"), first_name: "Diego".to_string(), last_name: "Manuel".to_string(), }; vec![ ActionMock::Put(edn_rs::to_string(person1.clone()), None), ActionMock::Put(edn_rs::to_string(person2), None), ActionMock::Delete(edn_rs::to_string(person1.crux__db___id), None), ] } fn test_actions() -> Actions { let person1 = Person { crux__db___id: CruxId::new("jorge-3"), first_name: "Michael".to_string(), last_name: "Jorge".to_string(), }; actions().append_delete(person1.crux__db___id) } fn actions() -> Actions { let person1 = Person { crux__db___id: CruxId::new("jorge-3"), first_name: "Michael".to_string(), last_name: "Jorge".to_string(), }; let person2 = Person { crux__db___id: CruxId::new("manuel-1"), first_name: "Diego".to_string(), last_name: "Manuel".to_string(), }; Actions::new().append_put(person1).append_put(person2) } #[derive(Debug, Clone, Serialize)] #[allow(non_snake_case)] pub struct Person { crux__db___id: CruxId, first_name: String, last_name: String, } }