from collections import OrderedDict
from pathlib import Path

import pytest

from app.models.spreadsheet import Spreadsheet


def test_can_create_spreadsheet_from_large_excel_file():
    with open(
        str(Path.cwd() / "tests" / "spreadsheet_files" / "excel 2007.xlsx"), "rb"
    ) as xl:
        ret = Spreadsheet.from_file(xl, filename="xl.xlsx")
    assert ret.as_csv_data


def test_can_create_spreadsheet_from_dict():
    assert Spreadsheet.from_dict(
        OrderedDict(
            foo="bar",
            name="Jane",
        )
    ).as_csv_data == ("foo,name\r\n" "bar,Jane\r\n")


def test_can_create_spreadsheet_from_dict_with_filename():
    assert (
        Spreadsheet.from_dict({}, filename="empty.csv").as_dict["file_name"]
        == "empty.csv"
    )


@pytest.mark.parametrize(
    ("args", "kwargs"),
    [
        (
            ("hello", ["hello"]),
            {},
        ),
        ((), {"csv_data": "hello", "rows": ["hello"]}),
    ],
)
def test_spreadsheet_checks_for_bad_arguments(args, kwargs):
    with pytest.raises(TypeError) as exception:
        Spreadsheet(*args, **kwargs)
    assert (
        str(exception.value)
        == "Spreadsheet must be created from either rows or CSV data"
    )
