browser_tester 1.5.0

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

#[test]
fn data_transfer_set_drag_image_returns_undefined_during_dragstart() -> Result<()> {
    let html = r#"
      <img id='img' src='about:blank' />
      <div id='source' draggable='true'></div>
      <p id='out'></p>
      <script>
        document.getElementById('source').addEventListener('dragstart', (event) => {
          const dt = event.dataTransfer;
          dt.setData('text/plain', 'alpha');
          const ret = dt.setDragImage(document.getElementById('img'), 10, 20);
          document.getElementById('out').textContent = [
            ret === undefined,
            dt.getData('text/plain'),
            dt.types.length
          ].join('|');
        });
      </script>
    "#;

    let mut h = Harness::from_html(html)?;
    h.dispatch("#source", "dragstart")?;
    h.assert_text("#out", "true|alpha|1")?;
    Ok(())
}

#[test]
fn data_transfer_set_drag_image_is_noop_outside_dragstart() -> Result<()> {
    let html = r#"
      <img id='img' src='about:blank' />
      <div id='source' draggable='true'></div>
      <p id='out'></p>
      <script>
        document.getElementById('source').addEventListener('dragover', (event) => {
          const ret = event.dataTransfer.setDragImage(document.getElementById('img'), 1, 2);
          document.getElementById('out').textContent = String(ret === undefined);
        });
      </script>
    "#;

    let mut h = Harness::from_html(html)?;
    h.dispatch("#source", "dragover")?;
    h.assert_text("#out", "true")?;
    Ok(())
}

#[test]
fn data_transfer_set_drag_image_requires_three_arguments() {
    let html = r#"
      <img id='img' src='about:blank' />
      <div id='source' draggable='true'></div>
      <script>
        document.getElementById('source').addEventListener('dragstart', (event) => {
          event.dataTransfer.setDragImage(document.getElementById('img'), 1);
        });
      </script>
    "#;

    let mut h = Harness::from_html(html).expect("harness should initialize");
    let err = h
        .dispatch("#source", "dragstart")
        .expect_err("setDragImage should require exactly three arguments");
    match err {
        Error::ScriptRuntime(msg) => {
            assert_eq!(
                msg,
                "dataTransfer.setDragImage requires exactly three arguments"
            )
        }
        other => panic!("unexpected error: {other:?}"),
    }
}

#[test]
fn data_transfer_set_drag_image_requires_element_first_argument() {
    let html = r#"
      <div id='source' draggable='true'></div>
      <script>
        document.getElementById('source').addEventListener('dragstart', (event) => {
          event.dataTransfer.setDragImage('not-element', 1, 2);
        });
      </script>
    "#;

    let mut h = Harness::from_html(html).expect("harness should initialize");
    let err = h
        .dispatch("#source", "dragstart")
        .expect_err("setDragImage should reject non-element first argument");
    match err {
        Error::ScriptRuntime(msg) => assert_eq!(
            msg,
            "TypeError: Failed to execute 'setDragImage': parameter 1 is not of type 'Element'"
        ),
        other => panic!("unexpected error: {other:?}"),
    }
}