Skip to content

Commit

Permalink
Add get_node_text
Browse files Browse the repository at this point in the history
  • Loading branch information
DanielleHuisman committed Aug 16, 2024
1 parent c3e4f70 commit 7d274c5
Show file tree
Hide file tree
Showing 8 changed files with 296 additions and 2 deletions.
181 changes: 181 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions packages/dom/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,13 @@ regex.workspace = true
thiserror.workspace = true
wasm-bindgen.workspace = true
web-sys = { workspace = true, features = [
"Document",
"Element",
"HtmlElement",
"HtmlInputElement",
"NodeList",
"Window",
] }

[dev-dependencies]
wasm-bindgen-test.workspace = true
28 changes: 28 additions & 0 deletions packages/dom/src/get_node_text.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
use wasm_bindgen::JsCast;
use web_sys::{Element, HtmlInputElement, Node};

use crate::util::node_list_to_vec;

pub fn get_node_text(node: &Node) -> String {
if node
.dyn_ref::<Element>()
.map(|element| {
element
.matches("input[type=submit], input[type=button], input[type=reset]")
.is_ok_and(|value| value)
})
.unwrap_or(false)
{
node.unchecked_ref::<HtmlInputElement>().value()
} else {
node_list_to_vec::<Node>(node.child_nodes())
.into_iter()
.filter_map(|child| {
(child.node_type() == Node::TEXT_NODE)
.then(|| child.text_content())
.flatten()
})
.collect::<Vec<_>>()
.join("")
}
}
2 changes: 2 additions & 0 deletions packages/dom/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
mod error;
mod get_node_text;
mod matches;
pub mod queries;
pub mod query_helpers;
mod types;
mod util;

pub use get_node_text::*;
pub use matches::get_default_normalizer;
pub use queries::*;
pub use query_helpers::*;
Expand Down
2 changes: 0 additions & 2 deletions packages/dom/src/queries/alt_text.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@ pub fn query_all_by_alt_text(
alt: &Matcher,
options: MatcherOptions,
) -> Result<Vec<HtmlElement>, QueryError> {
// check_container_type(container);

let valid_tag_regex = Regex::new(r"^(img|input|area|.+-.+)$").expect("Regex should be valid.");

Ok(
Expand Down
34 changes: 34 additions & 0 deletions packages/dom/tests/get_node_text.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
mod helpers;

use helpers::test_utils::RenderReturn;
use testing_library_dom::get_node_text;
use wasm_bindgen_test::{wasm_bindgen_test, wasm_bindgen_test_configure};

use self::helpers::test_utils::render;

wasm_bindgen_test_configure!(run_in_browser);

#[wasm_bindgen_test]
fn it_prints_out_the_text_content_of_a_container() {
let RenderReturn { container, .. } = render("Hello <!--skipped-->World!", None);

assert_eq!("Hello World!", get_node_text(&container));
}

#[wasm_bindgen_test]
fn it_prints_out_the_value_for_submit_and_button_inputs() {
let RenderReturn { container, .. } = render(
"<input type=\"submit\" value=\"save\"><input type=\"button\" value=\"reset\">",
None,
);

assert_eq!(
"save",
get_node_text(&container.first_child().expect("First child should exist."))
);

assert_eq!(
"reset",
get_node_text(&container.last_child().expect("Last child should exist."))
);
}
1 change: 1 addition & 0 deletions packages/dom/tests/helpers/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
pub mod test_utils;
44 changes: 44 additions & 0 deletions packages/dom/tests/helpers/test_utils.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
use web_sys::{window, Document, Element};

pub fn document() -> Document {
window()
.expect("Window should exist.")
.document()
.expect("Document should exist.")
}

pub struct RenderReturn {
pub container: Element,
pub rerender: Box<dyn Fn(&str) -> RenderReturn>,
}

pub fn render(html: &str, container: Option<Element>) -> RenderReturn {
let container = container.unwrap_or_else(|| {
document()
.create_element("div")
.expect("Element should be created.")
});

container.set_inner_html(html);

// TODO: container_queries

RenderReturn {
container: container.clone(),
rerender: Box::new(move |new_html| render(new_html, Some(container.clone()))),
}
}

pub fn render_into_document(html: &str) -> RenderReturn {
render(
html,
Some(document().body().expect("Body should exist.").into()),
)
}

pub fn cleanup() {
document()
.body()
.expect("Body should exist.")
.set_inner_html("");
}

0 comments on commit 7d274c5

Please sign in to comment.