Skip to content

Commit

Permalink
✅ add end to end test in CI
Browse files Browse the repository at this point in the history
  • Loading branch information
AbdelStark committed Jul 25, 2024
1 parent 9d26572 commit 4e25ddd
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 2 deletions.
52 changes: 52 additions & 0 deletions .github/workflows/e2e-test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
name: End-to-End Test

on:
push:
branches: [main]
pull_request:
branches: [main]

jobs:
e2e-test:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1

- name: Copy .env.docker to .env
run: cp .env.docker .env

- name: Install Docker Compose
run: |
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- name: Build and start services
run: docker-compose up -d --build

- name: Wait for services to be ready
run: |
timeout 60s bash -c 'until curl -s http://localhost:8080 > /dev/null; do sleep 1; done'
sleep 10 # Additional wait time for other services to initialize
- name: Run end-to-end test
run: |
docker-compose exec -T user-cli /bin/sh -c "cargo test --test e2e_test -- --nocapture"
- name: Collect logs
if: always()
run: docker-compose logs > docker-compose-logs.txt

- name: Upload logs
if: always()
uses: actions/upload-artifact@v2
with:
name: docker-compose-logs
path: docker-compose-logs.txt

- name: Stop services
if: always()
run: docker-compose down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
<h1>Askeladd</h1>
<h2>Censorship-resistant global proving network.</h2>

<a href="https://github.com/AbdelStark/askeladd/actions/workflows/ci.yaml"><img alt="GitHub Workflow Status (with event)" src="https://img.shields.io/github/actions/workflow/status/AbdelStark/askeladd/ci.yaml?style=for-the-badge" height=30></a>
<a href="https://github.com/AbdelStark/askeladd/actions/workflows/e2e-test.yaml"><img alt="GitHub Workflow Status E2E Tests" src="https://img.shields.io/github/actions/workflow/status/AbdelStark/askeladd/e2e-test.yaml?style=for-the-badge" height=30></a>
<a href="https://starkware.co/"><img src="https://img.shields.io/badge/By StarkWare-29296E.svg?&style=for-the-badge&logo=data:image/svg%2bxml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIGlkPSJhIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxODEgMTgxIj48ZGVmcz48c3R5bGU+LmJ7ZmlsbDojZmZmO308L3N0eWxlPjwvZGVmcz48cGF0aCBjbGFzcz0iYiIgZD0iTTE3Ni43Niw4OC4xOGwtMzYtMzcuNDNjLTEuMzMtMS40OC0zLjQxLTIuMDQtNS4zMS0xLjQybC0xMC42MiwyLjk4LTEyLjk1LDMuNjNoLjc4YzUuMTQtNC41Nyw5LjktOS41NSwxNC4yNS0xNC44OSwxLjY4LTEuNjgsMS44MS0yLjcyLDAtNC4yN0w5Mi40NSwuNzZxLTEuOTQtMS4wNC00LjAxLC4xM2MtMTIuMDQsMTIuNDMtMjMuODMsMjQuNzQtMzYsMzcuNjktMS4yLDEuNDUtMS41LDMuNDQtLjc4LDUuMThsNC4yNywxNi41OGMwLDIuNzIsMS40Miw1LjU3LDIuMDcsOC4yOS00LjczLTUuNjEtOS43NC0xMC45Ny0xNS4wMi0xNi4wNi0xLjY4LTEuODEtMi41OS0xLjgxLTQuNCwwTDQuMzksODguMDVjLTEuNjgsMi4zMy0xLjgxLDIuMzMsMCw0LjUzbDM1Ljg3LDM3LjNjMS4zNiwxLjUzLDMuNSwyLjEsNS40NCwxLjQybDExLjQtMy4xMSwxMi45NS0zLjYzdi45MWMtNS4yOSw0LjE3LTEwLjIyLDguNzYtMTQuNzYsMTMuNzNxLTMuNjMsMi45OC0uNzgsNS4zMWwzMy40MSwzNC44NGMyLjIsMi4yLDIuOTgsMi4yLDUuMTgsMGwzNS40OC0zNy4xN2MxLjU5LTEuMzgsMi4xNi0zLjYsMS40Mi01LjU3LTEuNjgtNi4wOS0zLjI0LTEyLjMtNC43OS0xOC4zOS0uNzQtMi4yNy0xLjIyLTQuNjItMS40Mi02Ljk5LDQuMyw1LjkzLDkuMDcsMTEuNTIsMTQuMjUsMTYuNzEsMS42OCwxLjY4LDIuNzIsMS42OCw0LjQsMGwzNC4zMi0zNS43NHExLjU1LTEuODEsMC00LjAxWm0tNzIuMjYsMTUuMTVjLTMuMTEtLjc4LTYuMDktMS41NS05LjE5LTIuNTktMS43OC0uMzQtMy42MSwuMy00Ljc5LDEuNjhsLTEyLjk1LDEzLjg2Yy0uNzYsLjg1LTEuNDUsMS43Ni0yLjA3LDIuNzJoLS42NWMxLjMtNS4zMSwyLjcyLTEwLjYyLDQuMDEtMTUuOGwxLjY4LTYuNzNjLjg0LTIuMTgsLjE1LTQuNjUtMS42OC02LjA5bC0xMi45NS0xNC4xMmMtLjY0LS40NS0xLjE0LTEuMDgtMS40Mi0xLjgxbDE5LjA0LDUuMTgsMi41OSwuNzhjMi4wNCwuNzYsNC4zMywuMTQsNS43LTEuNTVsMTIuOTUtMTQuMzhzLjc4LTEuMDQsMS42OC0xLjE3Yy0xLjgxLDYuNi0yLjk4LDE0LjEyLTUuNDQsMjAuNDYtMS4wOCwyLjk2LS4wOCw2LjI4LDIuNDYsOC4xNiw0LjI3LDQuMTQsOC4yOSw4LjU1LDEyLjk1LDEyLjk1LDAsMCwxLjMsLjkxLDEuNDIsMi4wN2wtMTMuMzQtMy42M1oiLz48L3N2Zz4=" alt="StarkWare" height="30"></a>

<a href="https://www.rust-lang.org/"> <img alt="Rust" src="https://img.shields.io/badge/rust-%23000000.svg?style=for-the-badge&logo=rust&logoColor=white" height=30></a>
<a href="https://bitcoin.org/"> <img alt="Bitcoin" src="https://img.shields.io/badge/Bitcoin-000?style=for-the-badge&logo=bitcoin&logoColor=white" height=30></a>
<a href="https://nostr.com/"> <img alt="Nostr" src="https://img.shields.io/badge/Nostr-000?style=for-the-badge" height=30></a>
</div>

## About
Expand Down
46 changes: 46 additions & 0 deletions tests/e2e_test.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
use askeladd::config::Settings;
use askeladd::types::{FibonnacciProvingRequest, FibonnacciProvingResponse};
use nostr_sdk::prelude::*;
use std::time::Duration;

#[tokio::test]
async fn test_e2e_flow() {
let settings = Settings::new().expect("Failed to load settings");

let secret_key = SecretKey::from_bech32(&settings.user_bech32_sk).unwrap();
let keys = Keys::new(secret_key);

let client = Client::new(&keys);
client.add_relay("ws://nostr-relay:8080").await.unwrap();
client.connect().await;
// Create and publish a proving request
let request = FibonnacciProvingRequest {
request_id: "test-request-id".to_string(),
log_size: 5,
claim: 443693538,
};
let request_json = serde_json::to_string(&request).unwrap();
let event_id = client.publish_text_note(request_json, &[]).await.unwrap();

// Wait for the response
let filter = Filter::new()
.kind(Kind::TextNote)
.custom_tag("e", vec![event_id.to_string()]);
let mut notifications = client.notifications();

let mut response_received = false;
for _ in 0..30 { // Wait up to 30 seconds
if let Ok(notification) = tokio::time::timeout(Duration::from_secs(1), notifications.next()).await {
if let Some(RelayPoolNotification::Event { event, .. }) = notification {
if let Ok(response) = serde_json::from_str::<FibonnacciProvingResponse>(&event.content) {
assert_eq!(response.request_id, request.request_id);
assert!(response.proof.is_some());
response_received = true;
break;
}
}
}
}

assert!(response_received, "Did not receive a response within the timeout period");
}

0 comments on commit 4e25ddd

Please sign in to comment.