def test_attributes_unchanged_by_transform(self):
        """Test that attributes set in init are unchanged by the transform method."""

        df = d.create_datediff_test_df()

        x = SeriesDtMethodTransformer(
            new_column_name="b_new",
            pd_method_name="to_period",
            column="b",
            pd_method_kwargs={"freq": "M"},
        )

        x2 = SeriesDtMethodTransformer(
            new_column_name="b_new",
            pd_method_name="to_period",
            column="b",
            pd_method_kwargs={"freq": "M"},
        )

        x.transform(df)

        assert (
            x.new_column_name == x2.new_column_name
        ), "new_column_name changed by SeriesDtMethodTransformer.transform"
        assert (
            x.pd_method_name == x2.pd_method_name
        ), "pd_method_name changed by SeriesDtMethodTransformer.transform"
        assert (x.columns == x2.columns
                ), "columns changed by SeriesDtMethodTransformer.transform"
        assert (
            x.pd_method_kwargs == x2.pd_method_kwargs
        ), "pd_method_kwargs changed by SeriesDtMethodTransformer.transform"
    def test_invalid_input_type_errors(self):
        """Test that an exceptions are raised for invalid input types."""

        with pytest.raises(
                TypeError,
                match=r"column should be a str but got \<class 'list'\>",
        ):

            SeriesDtMethodTransformer(new_column_name="a",
                                      pd_method_name=1,
                                      column=["b", "c"])

        with pytest.raises(
                TypeError,
                match=
                r"unexpected type \(\<class 'int'\>\) for pd_method_name, expecting str",
        ):

            SeriesDtMethodTransformer(new_column_name="a",
                                      pd_method_name=1,
                                      column="b")

        with pytest.raises(
                TypeError,
                match=
                r"unexpected type \(\<class 'float'\>\) for new_column_name, must be str",
        ):

            SeriesDtMethodTransformer(new_column_name=1.0,
                                      pd_method_name="year",
                                      column="b")

        with pytest.raises(
                TypeError,
                match=
                r"""pd_method_kwargs should be a dict but got type \<class 'int'\>""",
        ):

            SeriesDtMethodTransformer(
                new_column_name="a",
                pd_method_name="year",
                column="b",
                pd_method_kwargs=1,
            )

        with pytest.raises(
                TypeError,
                match=
                r"""unexpected type \(\<class 'int'\>\) for pd_method_kwargs key in position 1, must be str""",
        ):

            SeriesDtMethodTransformer(
                new_column_name="a",
                pd_method_name="year",
                column="b",
                pd_method_kwargs={
                    "a": 1,
                    2: "b"
                },
            )
    def test_inheritance(self):
        """Test that SeriesDtMethodTransformer inherits from BaseTransformer."""

        x = SeriesDtMethodTransformer(new_column_name="a",
                                      pd_method_name="year",
                                      column="b")

        h.assert_inheritance(x, tubular.base.BaseTransformer)
    def test_expected_output_overwrite(self, df, expected):
        """Test a single column output from transform gives expected results, when overwriting the original column."""

        x = SeriesDtMethodTransformer(
            new_column_name="a",
            pd_method_name="year",
            column="a",
            pd_method_kwargs={},
        )

        df_transformed = x.transform(df)

        h.assert_frame_equal_msg(
            actual=df_transformed,
            expected=expected,
            msg_tag=
            "Unexpected values in SeriesDtMethodTransformer.transform with pad, overwriting original column",
        )
    def test_expected_output_callable(self, df, expected):
        """Test transform gives expected results, when pd_method_name is a callable."""

        x = SeriesDtMethodTransformer(
            new_column_name="b_new",
            pd_method_name="to_period",
            column="b",
            pd_method_kwargs={"freq": "M"},
        )

        df_transformed = x.transform(df)

        h.assert_frame_equal_msg(
            actual=df_transformed,
            expected=expected,
            msg_tag=
            "Unexpected values in SeriesDtMethodTransformer.transform with to_period",
        )
    def test_class_methods(self):
        """Test that SeriesDtMethodTransformer has transform method."""

        x = SeriesDtMethodTransformer(new_column_name="a",
                                      pd_method_name="year",
                                      column="b")

        h.test_object_method(obj=x,
                             expected_method="transform",
                             msg="transform")
    def test_super_transform_called(self, mocker):
        """Test that BaseTransformer.transform called."""

        df = d.create_datediff_test_df()

        x = SeriesDtMethodTransformer(new_column_name="a2",
                                      pd_method_name="year",
                                      column="a")

        expected_call_args = {
            0: {
                "args": (d.create_datediff_test_df(), ),
                "kwargs": {}
            }
        }

        with h.assert_function_call(mocker, tubular.base.BaseTransformer,
                                    "transform", expected_call_args):

            x.transform(df)
    def test_exception_raised_non_pandas_method_passed(self):
        """Test and exception is raised if a non pd.Series.dt method is passed for pd_method_name."""

        with pytest.raises(
                AttributeError,
                match=
                """error accessing "dt.b" method on pd.Series object - pd_method_name should be a pd.Series.dt method""",
        ):

            SeriesDtMethodTransformer(new_column_name="a",
                                      pd_method_name="b",
                                      column="b")
    def test_callable_attribute_set(self, pd_method_name, callable_attr):
        """Test the _callable attribute is set to True if pd.Series.dt.pd_method_name is callable."""

        x = SeriesDtMethodTransformer(
            new_column_name="a",
            pd_method_name=pd_method_name,
            column="b",
            pd_method_kwargs={"d": 1},
        )

        h.test_object_attributes(
            obj=x,
            expected_attributes={"_callable": callable_attr},
            msg="_callable attribute for SeriesDtMethodTransformer set in init",
        )
    def test_attributes_set(self):
        """Test that the values passed for new_column_name, pd_method_name are saved to attributes on the object."""

        x = SeriesDtMethodTransformer(
            new_column_name="a",
            pd_method_name="year",
            column="b",
            pd_method_kwargs={"d": 1},
        )

        h.test_object_attributes(
            obj=x,
            expected_attributes={
                "new_column_name": "a",
                "pd_method_name": "year",
                "pd_method_kwargs": {
                    "d": 1
                },
            },
            msg="Attributes for SeriesDtMethodTransformer set in init",
        )
    def test_super_init_called(self, mocker):
        """Test that init calls BaseTransformer.init."""

        expected_call_args = {
            0: {
                "args": (),
                "kwargs": {
                    "columns": "b",
                    "verbose": True,
                    "copy": False
                }
            }
        }

        with h.assert_function_call(mocker, tubular.base.BaseTransformer,
                                    "__init__", expected_call_args):

            SeriesDtMethodTransformer(
                new_column_name="a",
                pd_method_name="year",
                column="b",
                copy=False,
                verbose=True,
            )