Merge pull request 'feat/client E2E testing' (#12) from e2e-testing into master

Reviewed-on: #12
pull/14/head
alban 3 years ago
commit 5511c729b4

43
Cargo.lock generated

@ -542,11 +542,13 @@ dependencies = [
"chrono", "chrono",
"dotenvy", "dotenvy",
"envy", "envy",
"fantoccini",
"perseus", "perseus",
"reqwasm", "reqwasm",
"serde", "serde",
"serde_json", "serde_json",
"sycamore", "sycamore",
"tokio",
] ]
[[package]] [[package]]
@ -1017,6 +1019,28 @@ version = "2.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
[[package]]
name = "fantoccini"
version = "0.19.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65f0fbe245d714b596ba5802b46f937f5ce68dcae0f32f9a70b5c3b04d3c6f64"
dependencies = [
"base64 0.13.1",
"cookie 0.16.2",
"futures-core",
"futures-util",
"http",
"hyper 0.14.24",
"hyper-tls",
"mime 0.3.16",
"serde",
"serde_json",
"time 0.3.17",
"tokio",
"url 2.3.1",
"webdriver",
]
[[package]] [[package]]
name = "fast-insiders" name = "fast-insiders"
version = "0.1.0" version = "0.1.0"
@ -4510,6 +4534,25 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "webdriver"
version = "0.46.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9973cb72c8587d5ad5efdb91e663d36177dc37725e6c90ca86c626b0cc45c93f"
dependencies = [
"base64 0.13.1",
"bytes",
"cookie 0.16.2",
"http",
"log 0.4.17",
"serde",
"serde_derive",
"serde_json",
"time 0.3.17",
"unicode-segmentation",
"url 2.3.1",
]
[[package]] [[package]]
name = "webpki" name = "webpki"
version = "0.22.0" version = "0.22.0"

@ -14,3 +14,7 @@ envy = { workspace = true }
perseus = { version = "0.3.6", features = ["hydrate"] } perseus = { version = "0.3.6", features = ["hydrate"] }
sycamore = { version = "0.7.1", features = ["ssr", "serde", "futures"] } sycamore = { version = "0.7.1", features = ["ssr", "serde", "futures"] }
reqwasm = "0.5.0" reqwasm = "0.5.0"
[dev-dependencies]
fantoccini = "0.19.3"
tokio = { version = "=1.20.1", features = ["macros", "rt", "rt-multi-thread"] }

@ -1,3 +1,4 @@
use perseus::checkpoint;
use serde::Deserialize; use serde::Deserialize;
use sycamore::prelude::*; use sycamore::prelude::*;
@ -62,6 +63,7 @@ where
.unwrap(); .unwrap();
visible.set(!res.is_empty()); visible.set(!res.is_empty());
item_list.set(res); item_list.set(res);
checkpoint("async_select_item_change");
}), }),
); );
} }

@ -91,7 +91,7 @@ pub fn index_page(
} }
} }
} }
div (class="flex flex-col items-center justify-center ") { div (id="main", class="flex flex-col items-center justify-center ") {
div (class="w-4/5 m-10 p-3 bg-slate-100 dark:bg-slate-600 rounded-lg items-center justify-center") { div (class="w-4/5 m-10 p-3 bg-slate-100 dark:bg-slate-600 rounded-lg items-center justify-center") {
a (class="hover:underline", href="/") { a (class="hover:underline", href="/") {
h1 ( h1 (
@ -102,7 +102,7 @@ pub fn index_page(
} }
BaseButton(filter_expand) BaseButton(filter_expand)
div () {} // Without this useless div, the code doesn't run in the browser div () {} // Without this useless div, the code doesn't run in the browser
div (class=format!("p-2 border rounded-lg border-slate-200 dark:border-slate-800 bg-slate-200 dark:bg-slate-700 transition-all ease-in {}", div (id="filters", class=format!("p-2 border rounded-lg border-slate-200 dark:border-slate-800 bg-slate-200 dark:bg-slate-700 transition-all ease-in {}",
if *expand.get() { "h-40 visible" } else { "h-0 collapse" }, if *expand.get() { "h-40 visible" } else { "h-0 collapse" },
) )
) )

@ -0,0 +1,79 @@
use fantoccini::{
actions::{InputSource, KeyAction, KeyActions},
error::CmdError,
Client, Locator,
};
use perseus::wait_for_checkpoint;
use std::time::Duration;
// This is is an E2E test with the following steps:
// - Go to the index page
// - Use the async select component to find any company
// - Click on this company and verify that we arrived
// - Come back to the root using the top left link
// - Find the first link in the table and click on it
// - Verify that all the company names in the table of the new page are the same as the link we
// clicked before
// Run like this:
// - Run any headless browser drive like geckodriver
// - Run perseus test
// - The backend should be available with some data
// - run PERSEUS_RUN_WASM_TESTS=true cargo test -- --test-threads 1
// (or use make test-client-cargo)
#[perseus::test]
async fn index(c: &mut Client) -> Result<(), fantoccini::error::CmdError> {
c.goto("http://localhost:8080").await?;
wait_for_checkpoint!("begin", 0, c);
let url = c.current_url().await?;
assert!(url.as_ref().starts_with("http://localhost:8080"));
wait_for_checkpoint!("page_visible", 0, c);
// Verify the page title
let title = c.find(Locator::Css("title")).await?.html(false).await?;
assert!(title.contains("Fast Insiders"));
wait_for_checkpoint!("page_interactive", 0, c);
// let table = c.find(Locator::Css("table")).await?.html(true).await?;
let filter_button = c.find(Locator::Css("#main button")).await?;
filter_button.click().await?;
let company_select = c.find(Locator::Css("#filters input")).await?;
company_select.send_keys("E").await?; // E is one of the most used letter.
wait_for_checkpoint!("async_select_item_change", 0, c);
let first_company = c.find(Locator::Css("div.relative li")).await?;
let clicked_company = first_company.text().await?;
first_company.click().await?;
let search_button = c.find(Locator::Css("#filters button")).await?;
search_button.click().await?;
let page = c.current_url().await?;
assert!(
page.as_ref().starts_with("http://localhost:8080/index/"),
"Unexpected target url reached: {}",
page
);
for a in c.find_all(Locator::Css("table a")).await? {
let a_text = a.text().await?;
assert_eq!(clicked_company, a_text, "The clicked company is different from the target page list of companies, respectively {} and {}", clicked_company, a_text);
}
let root_link = c.find(Locator::Css("a")).await?;
root_link.click().await?;
let first_company_in_table = c.find(Locator::Css("table a")).await?;
let company_name = first_company_in_table.text().await?;
first_company_in_table.click().await?;
for a in c.find_all(Locator::Css("table a")).await? {
let a_text = a.text().await?;
assert_eq!(company_name, a_text, "The clicked company is different from the target page list of companies, respectively {} and {}", company_name, a_text);
}
assert!(
page.as_ref().starts_with("http://localhost:8080/index/"),
"Unexpected target url reached: {}",
page
);
Ok(())
}

@ -21,3 +21,15 @@ serve:
client-deploy: client-deploy:
cd client && \ cd client && \
perseus deploy perseus deploy
test-client:
cd client && \
perseus test -w
test-server:
cd server && \
cargo test
test-client-cargo:
cd client && \
PERSEUS_RUN_WASM_TESTS=true cargo test -- --test-threads 1

@ -1,18 +1,12 @@
use futures::StreamExt; use futures::StreamExt;
use crate::{ use crate::amf::service::{
amf::service::{ information_req::{AMFRequest, AMFRequestType},
information_req::{AMFRequest, AMFRequestType}, pdf::AMFPdf,
pdf::AMFPdf,
},
env, logger,
}; };
#[tokio::test] #[tokio::test]
async fn read_data_from_last_100_amf_pdf() { async fn read_data_from_last_100_amf_pdf() {
env::load_env().expect("Failed to load .env");
logger::init_log().expect("Failed to init log");
let size = 100; let size = 100;
let req = AMFRequest::new(AMFRequestType::DD, 1, size) let req = AMFRequest::new(AMFRequestType::DD, 1, size)
.get_list() .get_list()

Loading…
Cancel
Save