use common::app_daemon_utils::mock_app_daemon; use common::prepare_test_env::{prepare_test_db, run_service_for_stream}; use common::test_utils::Key; use common::vm_cli_utils::airdrop; use detee_shared::app_proto; use detee_shared::app_proto::brain_app_cli_client::BrainAppCliClient; use std::vec; use surreal_brain::constants::{ACCOUNT, ACTIVE_APP, NEW_APP_REQ, TOKEN_DECIMAL}; use surreal_brain::db::prelude as db; mod common; #[tokio::test] async fn test_app_creation() { /* env_logger::builder() .filter_level(log::LevelFilter::Trace) .filter_module("tungstenite", log::LevelFilter::Debug) .filter_module("tokio_tungstenite", log::LevelFilter::Debug) .init(); */ let db = prepare_test_db().await.unwrap(); let brain_channel = run_service_for_stream().await.unwrap(); let daemon_key = mock_app_daemon(&brain_channel, None).await.unwrap(); let key = Key::new(); let mut new_app_req = app_proto::NewAppReq { admin_pubkey: key.pubkey.clone(), node_pubkey: daemon_key.clone(), price_per_unit: 1200, resource: Some(app_proto::AppResource { ports: vec![8080, 8081], ..Default::default() }), locked_nano: 100, ..Default::default() }; let mut client_app_cli = BrainAppCliClient::new(brain_channel.clone()); let new_app_resp = client_app_cli.new_app(key.sign_request(new_app_req.clone()).unwrap()).await; assert!(new_app_resp.is_err()); let new_app_err = new_app_resp.err().unwrap(); assert!(new_app_err.to_string().contains("Insufficient funds")); let airdrop_amount = 10; airdrop(&brain_channel, &key.pubkey, airdrop_amount).await.unwrap(); let new_app_resp = client_app_cli .new_app(key.sign_request(new_app_req.clone()).unwrap()) .await .unwrap() .into_inner(); let active_app = db.select::>((ACTIVE_APP, new_app_resp.uuid)).await.unwrap(); assert!(active_app.is_some()); let daemon_key_02 = mock_app_daemon(&brain_channel, Some("something went wrong 01".to_string())).await.unwrap(); new_app_req.node_pubkey = daemon_key_02.clone(); let new_app_resp = client_app_cli .new_app(key.sign_request(new_app_req.clone()).unwrap()) .await .unwrap() .into_inner(); assert!(!new_app_resp.error.is_empty()); let app_req_db = db.select::>((NEW_APP_REQ, new_app_resp.uuid)).await.unwrap(); assert!(!app_req_db.unwrap().error.is_empty()); let acc_db: db::Account = db.select((ACCOUNT, key.pubkey.clone())).await.unwrap().unwrap(); assert_eq!(acc_db.balance, (airdrop_amount * TOKEN_DECIMAL - 100)); assert_eq!(acc_db.tmp_locked, 0); let locking_nano = 1288; new_app_req.node_pubkey = daemon_key; new_app_req.locked_nano = locking_nano; let new_app_resp = client_app_cli.new_app(key.sign_request(new_app_req).unwrap()).await.unwrap().into_inner(); assert!(new_app_resp.error.is_empty()); let active_app = db.select::>((ACTIVE_APP, new_app_resp.uuid)).await.unwrap(); assert!(active_app.is_some()); let acc_db: db::Account = db.select((ACCOUNT, key.pubkey.clone())).await.unwrap().unwrap(); assert_eq!(acc_db.balance, airdrop_amount * TOKEN_DECIMAL - (locking_nano + 100)); assert_eq!(acc_db.tmp_locked, 0); }