import ast
import pytest

from pre_commit_hooks.debug_statement_hook import DebugStatement
from pre_commit_hooks.debug_statement_hook import debug_statement_hook
from pre_commit_hooks.debug_statement_hook import ImportStatementParser
from testing.util import get_resource_path


@pytest.fixture
def ast_with_no_debug_imports():
    return ast.parse("""
import foo
import bar
import baz
from foo import bar
""")


@pytest.fixture
def ast_with_debug_import_form_1():
    return ast.parse("""

import ipdb; ipdb.set_trace()

""")


@pytest.fixture
def ast_with_debug_import_form_2():
    return ast.parse("""

from pudb import set_trace; set_trace()

""")


def test_returns_no_debug_statements(ast_with_no_debug_imports):
    visitor = ImportStatementParser()
    visitor.visit(ast_with_no_debug_imports)
    assert visitor.debug_import_statements == []


def test_returns_one_form_1(ast_with_debug_import_form_1):
    visitor = ImportStatementParser()
    visitor.visit(ast_with_debug_import_form_1)
    assert visitor.debug_import_statements == [
        DebugStatement('ipdb', 3, 0)
    ]


def test_returns_one_form_2(ast_with_debug_import_form_2):
    visitor = ImportStatementParser()
    visitor.visit(ast_with_debug_import_form_2)
    assert visitor.debug_import_statements == [
        DebugStatement('pudb', 3, 0)
    ]


def test_returns_one_for_failing_file():
    ret = debug_statement_hook([get_resource_path('file_with_debug.notpy')])
    assert ret == 1


def test_returns_zero_for_passing_file():
    ret = debug_statement_hook([__file__])
    assert ret == 0
