import unittest
from unittest.mock import MagicMock, patch

import pandas as pd
from pandas.testing import assert_frame_equal

from data_import.pipeline.readers import (
    FILE_NAME_COLUMN,
    UPLOAD_NAME_COLUMN,
    UUID_COLUMN,
    Reader,
)


class TestReader(unittest.TestCase):
    def setUp(self):
        self.parser = MagicMock()
        self.parser.parse.return_value = [{"a": 1}, {"a": 2}]
        filename = MagicMock()
        filename.generated_name = "filename"
        filename.upload_name = "upload_name"
        self.filenames = MagicMock()
        self.filenames.__iter__.return_value = [filename]
        self.rows = [
            {
                UUID_COLUMN: "uuid",
                FILE_NAME_COLUMN: filename.generated_name,
                UPLOAD_NAME_COLUMN: filename.upload_name,
                "a": 1,
            },
            {
                UUID_COLUMN: "uuid",
                FILE_NAME_COLUMN: filename.generated_name,
                UPLOAD_NAME_COLUMN: filename.upload_name,
                "a": 2,
            },
        ]

    @patch("data_import.pipeline.readers.uuid.uuid4")
    def test_iter_method(self, mock):
        mock.return_value = "uuid"
        reader = Reader(self.filenames, self.parser)
        self.assertEqual(list(reader), self.rows)

    @patch("data_import.pipeline.readers.uuid.uuid4")
    def test_batch(self, mock):
        mock.return_value = "uuid"
        reader = Reader(self.filenames, self.parser)
        batch = next(reader.batch(2))
        expected_df = pd.DataFrame(self.rows)
        assert_frame_equal(batch, expected_df)