minimum locking balance on deployment locking balance on app deployment refunding locked nano while error on daemon returning appropreate error on app deployment fixed some typos on logging new timeout constants for daemon respose minor change in schema and proto extensive tests on app deployments fixed some vm tests
92 lines
3.3 KiB
Rust
92 lines
3.3 KiB
Rust
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::<Option<db::ActiveApp>>((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::<Option<db::NewAppReq>>((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::<Option<db::ActiveApp>>((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);
|
|
}
|