browser_tester 1.5.0

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

#[test]
fn dispatch_event_returns_false_when_cancelable_and_prevented() -> Result<()> {
    let html = r#"
        <div id='box'></div>
        <button id='btn'>run</button>
        <p id='result'></p>
        <script>
          const box = document.getElementById('box');
          box.addEventListener('custom', (event) => {
            event.preventDefault();
            document.getElementById('result').textContent = String(event.defaultPrevented);
          });
          document.getElementById('btn').addEventListener('click', () => {
            const ok = box.dispatchEvent(new Event('custom', { cancelable: true }));
            document.getElementById('result').textContent =
              document.getElementById('result').textContent + ':' + String(ok);
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#btn")?;
    h.assert_text("#result", "true:false")?;
    Ok(())
}

#[test]
fn dispatch_event_returns_true_when_not_cancelable_even_if_prevent_default_called() -> Result<()> {
    let html = r#"
        <div id='box'></div>
        <button id='btn'>run</button>
        <p id='result'></p>
        <script>
          const box = document.getElementById('box');
          box.addEventListener('custom', (event) => {
            event.preventDefault();
            document.getElementById('result').textContent = String(event.defaultPrevented);
          });
          document.getElementById('btn').addEventListener('click', () => {
            const ok = box.dispatchEvent(new Event('custom'));
            document.getElementById('result').textContent =
              document.getElementById('result').textContent + ':' + String(ok);
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#btn")?;
    h.assert_text("#result", "false:true")?;
    Ok(())
}

#[test]
fn dispatch_event_is_synchronous_and_sets_target_to_dispatch_target() -> Result<()> {
    let html = r#"
        <div id='box'></div>
        <button id='btn'>run</button>
        <p id='result'></p>
        <script>
          const box = document.getElementById('box');
          const order = [];
          box.addEventListener('custom', (event) => {
            order.push('listener:' + String(event.target === box));
          });
          document.getElementById('btn').addEventListener('click', () => {
            order.push('before');
            const ok = box.dispatchEvent(new Event('custom'));
            order.push('after:' + String(ok));
            document.getElementById('result').textContent = order.join('|');
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#btn")?;
    h.assert_text("#result", "before|listener:true|after:true")?;
    Ok(())
}

#[test]
fn dispatch_event_works_on_event_target_instance_and_window() -> Result<()> {
    let html = r#"
        <button id='btn'>run</button>
        <p id='result'></p>
        <script>
          const emitter = new EventTarget();
          const out = document.getElementById('result');
          emitter.addEventListener('ping', (event) => {
            out.textContent = out.textContent + 'E' + String(event.target === emitter) + '|';
          });
          window.addEventListener('resize', (event) => {
            out.textContent = out.textContent + 'W' + String(event.target === window) + '|';
          });
          document.getElementById('btn').addEventListener('click', () => {
            out.textContent = '';
            const e1 = emitter.dispatchEvent(new Event('ping'));
            const e2 = window.dispatchEvent(new Event('resize'));
            out.textContent = out.textContent + 'R' + String(e1) + ':' + String(e2);
          });
        </script>
        "#;

    let mut h = Harness::from_html(html)?;
    h.click("#btn")?;
    h.assert_text("#result", "Etrue|Wtrue|Rtrue:true")?;
    Ok(())
}

#[test]
fn dispatch_event_throws_for_empty_event_type() -> Result<()> {
    let html = r#"
        <div id='box'></div>
        <button id='btn'>run</button>
        <p id='result'></p>
        <script>
          const box = document.getElementById('box');
          document.getElementById('btn').addEventListener('click', () => {
            let threw = false;
            try {
              box.dispatchEvent('');
            } catch (err) {
              threw = String(err).includes('InvalidStateError');
            }
            document.getElementById('result').textContent = String(threw);
          });
        </script>
        "#;

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