Skip to content

Commit

Permalink
test: add tests for leave federation endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
okjodom committed Feb 20, 2024
1 parent 6823e28 commit 4aa6495
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 6 deletions.
3 changes: 2 additions & 1 deletion gateway/cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,9 +160,10 @@ async fn main() -> anyhow::Result<()> {
print_response(response).await;
}
Commands::LeaveFed { federation_id } => {
client()
let response = client()
.leave_federation(LeaveFedPayload { federation_id })
.await?;
print_response(response).await;
}
Commands::Backup { federation_id } => {
client().backup(BackupPayload { federation_id }).await?;
Expand Down
14 changes: 12 additions & 2 deletions gateway/ln-gateway/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -964,7 +964,16 @@ impl Gateway {
Err(GatewayError::Disconnected)
}

pub async fn handle_leave_federation(&mut self, payload: LeaveFedPayload) -> Result<()> {
pub async fn handle_leave_federation(
&mut self,
payload: LeaveFedPayload,
) -> Result<FederationInfo> {
let federation_info = {
let client = self.select_client(payload.federation_id).await?;
self.make_federation_info(client.value(), payload.federation_id)
.await
};

// TODO: This should optimistically try to contact the federation to remove the
// registration record
let _client_joining_lock = self.client_joining_lock.lock().await;
Expand All @@ -977,7 +986,8 @@ impl Gateway {
.await;
dbtx.commit_tx_result()
.await
.map_err(GatewayError::DatabaseError)
.map_err(GatewayError::DatabaseError)?;
Ok(federation_info)
}

pub async fn handle_backup_msg(
Expand Down
5 changes: 4 additions & 1 deletion gateway/ln-gateway/src/rpc/rpc_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,10 @@ impl GatewayRpcClient {
self.call_post(url, payload).await
}

pub async fn leave_federation(&self, payload: LeaveFedPayload) -> GatewayRpcResult<()> {
pub async fn leave_federation(
&self,
payload: LeaveFedPayload,
) -> GatewayRpcResult<FederationInfo> {
let url = self.base_url.join("/leave-fed").expect("invalid base url");
self.call_post(url, payload).await
}
Expand Down
4 changes: 2 additions & 2 deletions gateway/ln-gateway/src/rpc/rpc_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,8 @@ async fn leave_fed(
Extension(mut gateway): Extension<Gateway>,
Json(payload): Json<LeaveFedPayload>,
) -> Result<impl IntoResponse, GatewayError> {
gateway.handle_leave_federation(payload).await?;
Ok(Json(json!(())))
let fed = gateway.handle_leave_federation(payload).await?;
Ok(Json(json!(fed)))
}

/// Backup a gateway actor state
Expand Down
47 changes: 47 additions & 0 deletions gateway/ln-gateway/tests/integration_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1168,6 +1168,53 @@ async fn test_gateway_shows_info_about_all_connected_federations() -> anyhow::Re
.await
}

#[tokio::test(flavor = "multi_thread")]
async fn test_gateway_can_leave_connected_federations() -> anyhow::Result<()> {
multi_federation_test(
LightningNodeType::Lnd,
|gateway, rpc, fed1, fed2, _| async move {
assert_eq!(rpc.get_info().await.unwrap().federations.len(), 0);

let id1 = fed1.invite_code().federation_id();
let id2 = fed2.invite_code().federation_id();

connect_federations(&rpc, &[fed1, fed2]).await.unwrap();

let info = rpc.get_info().await.unwrap();
assert_eq!(info.federations.len(), 2);
assert!(info
.federations
.iter()
.any(|info| info.federation_id == id1 && info.balance_msat == Amount::ZERO));
assert!(info
.federations
.iter()
.any(|info| info.federation_id == id2 && info.balance_msat == Amount::ZERO));

// remove first connected federation
let fed_info = rpc
.leave_federation(LeaveFedPayload { federation_id: id1 })
.await
.unwrap();
assert_eq!(fed_info.federation_id, id1);

// remove second connected federation
let fed_info = rpc
.leave_federation(LeaveFedPayload { federation_id: id2 })
.await
.unwrap();
assert_eq!(fed_info.federation_id, id2);

let info = rpc.get_info().await.unwrap();
assert_eq!(info.federations.len(), 0);

drop(gateway); // keep until the end to avoid the gateway shutting down too early
Ok(())
},
)
.await
}

#[tokio::test(flavor = "multi_thread")]
async fn test_gateway_shows_balance_for_any_connected_federation() -> anyhow::Result<()> {
multi_federation_test(
Expand Down

0 comments on commit 4aa6495

Please sign in to comment.