dom_testing_library 0.1.0

dom_testing_library is a lightweight front end testing toolkit for the rust frontend ecosystem. Heavily inspired by https://testing-library.com/ , write wasm_bindgen tests for your rust front end framework the same way your users will use it.
Documentation
use dom_testing_library::*;
use wasm_bindgen::JsCast;
use wasm_bindgen_test::*;
use web_sys::{HtmlElement, HtmlInputElement, HtmlLabelElement, Node};
wasm_bindgen_test_configure!(run_in_browser);

#[wasm_bindgen_test]
pub fn by_id() {
    let document = web_sys::window().unwrap().document().unwrap();
    let body = document.body().unwrap();
    let test_wrapper = document.create_element("div").unwrap();
    let div = document.create_element("div").unwrap();
    body.append_child(test_wrapper.dyn_ref::<Node>().unwrap())
        .unwrap();
    let renderer = ElementWrapper(&test_wrapper);
    test_wrapper
        .append_child(div.dyn_ref::<Node>().unwrap())
        .unwrap();
    let div_2 = document.create_element("div").unwrap();
    test_wrapper
        .append_child(div_2.dyn_ref::<Node>().unwrap())
        .unwrap();
    div.set_id("div_1");
    _ = renderer.get_by_id_contains("div").unwrap();
    assert_eq!(
        div,
        renderer
            .get_by_id_contains("div")
            .unwrap()
            .0
            .unchecked_into()
    );
    div_2.set_id("div_2");
    assert_ne!(div_2, div);
    let err = renderer.get_by_id_contains("div");
    assert!(err.is_more_than_one());
    assert_eq!(
        renderer
            .get_by_id("div_1")
            .unwrap()
            .0
            .unchecked_into::<web_sys::Element>(),
        div
    );
    assert!(renderer.get_by_id("div_3").is_not_found());
    assert_ne!(
        renderer.get_by_id("div_1").unwrap(),
        (renderer.get_by_id("div_2").unwrap())
    );
    assert_eq!(renderer.get_all_by_id_contains("div").len(), 2);
}

#[wasm_bindgen_test]
pub fn by_label() {
    let document = web_sys::window().unwrap().document().unwrap();
    let body = document.body().unwrap();
    let test_wrapper = document.create_element("div").unwrap();
    let renderer = ElementWrapper(&test_wrapper);
    body.append_child(test_wrapper.dyn_ref::<Node>().unwrap())
        .unwrap();
    let div = document.create_element("div").unwrap();
    let label = document
        .create_element("label")
        .unwrap()
        .unchecked_into::<HtmlLabelElement>();
    let field = document.create_element("input").unwrap();
    label.set_html_for("field_1");
    label.set_inner_text("Field One");
    field.set_id("field_1");
    div.append_child(&label.into()).unwrap();
    div.append_child(&field.into()).unwrap();
    test_wrapper.append_child(&div.into()).unwrap();
    assert!(renderer.get_by_label("Field One").is_ok());
    assert!(renderer.get_by_label_contains("Field").is_ok());
    assert!(renderer.get_by_label("Fiexl").is_not_found());
    assert!(renderer.get_by_label_contains("xx").is_not_found());
    let label = document
        .create_element("label")
        .unwrap()
        .unchecked_into::<HtmlLabelElement>();
    let field = document.create_element("input").unwrap();
    label.set_html_for("field_2");
    label.set_inner_text("Field Two");
    field.set_id("field_2");
    test_wrapper.append_child(&label.into()).unwrap();
    test_wrapper.append_child(&field.into()).unwrap();
    let label = document
        .create_element("label")
        .unwrap()
        .unchecked_into::<HtmlLabelElement>();
    let field: web_sys::Element = document.create_element("input").unwrap();
    label.set_html_for("field_3");
    label.set_inner_text("Field One");
    field.set_id("field_3");
    test_wrapper.append_child(&label.into()).unwrap();
    test_wrapper.append_child(&field.into()).unwrap();
    assert!(renderer.get_by_label_contains("Field").is_more_than_one());
    assert_eq!(renderer.get_all_by_label("Field One").len(), 2);
    assert_eq!(renderer.get_all_by_label_contains("Field").len(), 3);
}

#[wasm_bindgen_test]
pub fn by_text() {
    let document = web_sys::window().unwrap().document().unwrap();
    let body = document.body().unwrap();
    let test_wrapper = document.create_element("div").unwrap();
    let renderer = ElementWrapper(&test_wrapper);
    body.append_child(test_wrapper.dyn_ref::<Node>().unwrap())
        .unwrap();
    let div = document.create_element("div").unwrap();
    div.clone()
        .unchecked_into::<HtmlElement>()
        .set_inner_text("hello");
    test_wrapper
        .append_child(div.dyn_ref::<Node>().unwrap())
        .unwrap();

    _ = renderer.get_by_text_contains("hello").unwrap();
    let div_2 = document.create_element("div").unwrap();
    div_2
        .clone()
        .unchecked_into::<HtmlElement>()
        .set_inner_text("hello_2");
    test_wrapper
        .append_child(div_2.dyn_ref::<Node>().unwrap())
        .unwrap();
    let err = renderer.get_by_text_contains("hello");
    assert!(err.is_more_than_one());
    assert_eq!(
        div,
        renderer.get_by_text("hello").unwrap().0.unchecked_into()
    );
    assert_ne!(div_2, (div));
    assert_eq!(
        renderer
            .get_by_text("hello_2")
            .unwrap()
            .0
            .unchecked_into::<web_sys::Element>(),
        div_2
    );
    assert!(renderer.get_by_text("hello_3").is_not_found());
    assert_eq!(renderer.get_all_by_text_contains("hello").len(), 2);
    assert_eq!(renderer.get_all_by_text("hello").len(), 1);
}

#[wasm_bindgen_test]
pub fn by_display_value() {
    let document = web_sys::window().unwrap().document().unwrap();
    let body = document.body().unwrap();
    let test_wrapper = document.create_element("div").unwrap();
    let renderer = ElementWrapper(&test_wrapper);
    body.append_child(test_wrapper.dyn_ref::<Node>().unwrap())
        .unwrap();
    let div = document.create_element("div").unwrap();
    let label = document
        .create_element("label")
        .unwrap()
        .unchecked_into::<HtmlLabelElement>();
    let field = document.create_element("input").unwrap();
    label.set_html_for("field_1");
    label.set_inner_text("Password");
    field.set_id("field_1");
    div.append_child(&label.into()).unwrap();
    div.append_child(field.dyn_ref::<Node>().unwrap()).unwrap();
    test_wrapper
        .append_child(div.dyn_ref::<Node>().unwrap())
        .unwrap();
    let field = TestElement(field.unchecked_into::<HtmlElement>());
    field.set_display_value("1234");
    let input = renderer.get_by_display_value("1234").unwrap();
    assert_eq!(input, field);
    let area = document.create_element("textarea").unwrap();
    div.append_child(area.dyn_ref::<Node>().unwrap()).unwrap();
    let area = TestElement(area.unchecked_into::<HtmlElement>());
    area.set_display_value("1234");
    assert_eq!(renderer.get_all_by_display_value("1234").len(), 2);
}

#[wasm_bindgen_test]
pub fn by_role() {
    let document = web_sys::window().unwrap().document().unwrap();
    let body = document.body().unwrap();
    let test_wrapper = document.create_element("div").unwrap();
    let renderer = ElementWrapper(&test_wrapper);
    body.append_child(test_wrapper.dyn_ref::<Node>().unwrap())
        .unwrap();
    let div = document.create_element("div").unwrap();
    let label = document
        .create_element("label")
        .unwrap()
        .unchecked_into::<HtmlLabelElement>();
    let field = document
        .create_element("input")
        .unwrap()
        .unchecked_into::<HtmlInputElement>();
    label.set_html_for("field_1");
    field.set_inner_text("Password");
    field.set_attribute("role", "password").unwrap();
    field.set_id("field_1");
    div.append_child(&label.into()).unwrap();
    div.append_child(field.dyn_ref::<Node>().unwrap()).unwrap();
    test_wrapper
        .append_child(div.dyn_ref::<Node>().unwrap())
        .unwrap();
    assert!(renderer.get_by_role("password").is_ok());
}

#[wasm_bindgen_test]
pub fn by_placeholder() {
    let document = web_sys::window().unwrap().document().unwrap();
    let body = document.body().unwrap();
    let test_wrapper = document.create_element("div").unwrap();
    let renderer = ElementWrapper(&test_wrapper);
    body.append_child(test_wrapper.dyn_ref::<Node>().unwrap())
        .unwrap();
    let div = document.create_element("div").unwrap();
    let label = document
        .create_element("label")
        .unwrap()
        .unchecked_into::<HtmlLabelElement>();
    let field = document
        .create_element("input")
        .unwrap()
        .unchecked_into::<HtmlInputElement>();
    label.set_html_for("field_1");
    field.set_placeholder("Password");
    field.set_id("field_1");
    div.append_child(&label.into()).unwrap();
    div.append_child(field.dyn_ref::<Node>().unwrap()).unwrap();
    test_wrapper
        .append_child(div.dyn_ref::<Node>().unwrap())
        .unwrap();
    let input = renderer.get_by_placeholder("Password").unwrap();
    assert_eq!(input, TestElement(field.unchecked_into::<HtmlElement>()));
}