browser_tester 1.5.0

Deterministic lightweight browser runtime for Rust tests
Documentation
use super::*;

#[test]
fn element_matches_mdn_example_detects_matching_selector() -> Result<()> {
    let html = r#"
        <ul id='birds'>
          <li>Orange-winged parrot</li>
          <li class='endangered'>Philippine eagle</li>
          <li>Great white pelican</li>
        </ul>
        <button id='run'>run</button>
        <p id='result'></p>
        <script>
          document.getElementById('run').addEventListener('click', () => {
            const birds = document.querySelectorAll('li');
            let endangered = '';
            for (const bird of birds) {
              if (bird.matches('.endangered')) {
                endangered = bird.textContent;
              }
            }
            document.getElementById('result').textContent = endangered;
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#run")?;
    h.assert_text("#result", "Philippine eagle")?;
    Ok(())
}

#[test]
fn element_matches_throws_syntax_error_for_invalid_literal_selector() -> Result<()> {
    let html = r#"
        <div id='target'></div>
        <button id='run'>run</button>
        <script>
          document.getElementById('run').addEventListener('click', () => {
            document.getElementById('target').matches('div[');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    let err = h
        .click("#run")
        .expect_err("invalid selector should throw syntax error");
    match err {
        Error::ScriptRuntime(message) => {
            assert!(
                message.contains("SyntaxError"),
                "unexpected runtime error message: {message}"
            );
        }
        other => panic!("expected script runtime error, got: {other:?}"),
    }
    Ok(())
}

#[test]
fn element_matches_throws_syntax_error_for_invalid_dynamic_selector() -> Result<()> {
    let html = r#"
        <div id='target'></div>
        <button id='run'>run</button>
        <script>
          document.getElementById('run').addEventListener('click', () => {
            const selector = 'div[';
            document.getElementById('target').matches(selector);
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    let err = h
        .click("#run")
        .expect_err("invalid selector should throw syntax error");
    match err {
        Error::ScriptRuntime(message) => {
            assert!(
                message.contains("SyntaxError"),
                "unexpected runtime error message: {message}"
            );
        }
        other => panic!("expected script runtime error, got: {other:?}"),
    }
    Ok(())
}