import pytest

from webdriver import NoSuchElementException

from tests.support.asserts import assert_error, assert_success


def switch_to_parent_frame(session):
    return session.transport.send(
        "POST", "session/{session_id}/frame/parent".format(**vars(session)))


def test_null_response_value(session, inline, iframe):
    session.url = inline(iframe("<p>foo"))
    frame_element = session.find.css("iframe", all=False)
    session.switch_frame(frame_element)

    response = switch_to_parent_frame(session)
    value = assert_success(response)
    assert value is None


def test_no_top_browsing_context(session, url):
    session.window_handle = session.new_window()

    session.url = url("/webdriver/tests/support/html/frames.html")

    subframe = session.find.css("#sub-frame", all=False)
    session.switch_frame(subframe)

    session.window.close()

    response = switch_to_parent_frame(session)
    assert_error(response, "no such window")


def test_no_parent_browsing_context(session, url):
    session.url = url("/webdriver/tests/support/html/frames.html")

    subframe = session.find.css("#sub-frame", all=False)
    session.switch_frame(subframe)

    deleteframe = session.find.css("#delete-frame", all=False)
    session.switch_frame(deleteframe)

    button = session.find.css("#remove-top", all=False)
    button.click()

    response = switch_to_parent_frame(session)
    assert_error(response, "no such window")


def test_no_browsing_context(session, closed_frame):
    response = switch_to_parent_frame(session)
    assert_success(response)

    session.find.css("#delete", all=False)


def test_no_browsing_context_when_already_top_level(session, closed_window):
    response = switch_to_parent_frame(session)
    assert_error(response, "no such window")


def test_switch_from_iframe(session, inline, iframe):
    session.url = inline(iframe("<p>foo"))
    frame_element = session.find.css("iframe", all=False)
    session.switch_frame(frame_element)
    element = session.find.css("p", all=False)

    result = switch_to_parent_frame(session)
    assert_success(result)

    with pytest.raises(NoSuchElementException):
        element.text


def test_switch_from_top_level(session, inline):
    session.url = inline("<p>foo")
    element = session.find.css("p", all=False)

    result = switch_to_parent_frame(session)
    assert_success(result)

    assert element.text == "foo"
