"""Steps for behavioral style tests are defined in this module.

Each step is defined by the string decorating it. This string is used
to call the step in "*.feature" file.

"""

import wrappers
from behave import when, then
from textwrap import dedent


@when("we create table")
def step_create_table(context):
    """Send create table."""
    context.cli.sendline("create table a(x text);")


@when("we insert into table")
def step_insert_into_table(context):
    """Send insert into table."""
    context.cli.sendline("""insert into a(x) values('xxx');""")


@when("we update table")
def step_update_table(context):
    """Send insert into table."""
    context.cli.sendline("""update a set x = 'yyy' where x = 'xxx';""")


@when("we select from table")
def step_select_from_table(context):
    """Send select from table."""
    context.cli.sendline("select * from a;")


@when("we delete from table")
def step_delete_from_table(context):
    """Send deete from table."""
    context.cli.sendline("""delete from a where x = 'yyy';""")


@when("we drop table")
def step_drop_table(context):
    """Send drop table."""
    context.cli.sendline("drop table a;")


@then("we see table created")
def step_see_table_created(context):
    """Wait to see create table output."""
    wrappers.expect_exact(context, "Query OK, 0 rows affected", timeout=2)


@then("we see record inserted")
def step_see_record_inserted(context):
    """Wait to see insert output."""
    wrappers.expect_exact(context, "Query OK, 1 row affected", timeout=2)


@then("we see record updated")
def step_see_record_updated(context):
    """Wait to see update output."""
    wrappers.expect_exact(context, "Query OK, 1 row affected", timeout=2)


@then("we see data selected")
def step_see_data_selected(context):
    """Wait to see select output."""
    wrappers.expect_pager(
        context,
        dedent("""\
            +-----+\r
            | x   |\r
            +-----+\r
            | yyy |\r
            +-----+\r
            \r
            """),
        timeout=2,
    )
    wrappers.expect_exact(context, "1 row in set", timeout=2)


@then("we see record deleted")
def step_see_data_deleted(context):
    """Wait to see delete output."""
    wrappers.expect_exact(context, "Query OK, 1 row affected", timeout=2)


@then("we see table dropped")
def step_see_table_dropped(context):
    """Wait to see drop output."""
    wrappers.expect_exact(context, "Query OK, 0 rows affected", timeout=2)


@when("we select null")
def step_select_null(context):
    """Send select null."""
    context.cli.sendline("select null;")


@then("we see null selected")
def step_see_null_selected(context):
    """Wait to see null output."""
    wrappers.expect_pager(
        context,
        dedent("""\
            +--------+\r
            | NULL   |\r
            +--------+\r
            | <null> |\r
            +--------+\r
            \r
            """),
        timeout=2,
    )
    wrappers.expect_exact(context, "1 row in set", timeout=2)