class ConstraintTest(unittest.TestCase):
    COLUMN_NAME = "column name"

    def setUp(self):
        df = get_df()
        self.check = Check(df)
        self.jvmCheck = self.check.jvmCheck

    def test_hasUniqueKey(self):
        column_names = ["a", "b"]
        jvm_column_names = Mock()
        self.check._jvm.scala.collection.JavaConversions.\
            iterableAsScalaIterable().toList = Mock(
                return_value=jvm_column_names
        )
        self.check.hasUniqueKey(self.COLUMN_NAME, column_names)
        self.jvmCheck.hasUniqueKey.assert_called_with(
            self.COLUMN_NAME, jvm_column_names
        )

    def test_isNeverNull(self):
        self.check.isNeverNull(self.COLUMN_NAME)
        self.jvmCheck.isNeverNull.assert_called_with(self.COLUMN_NAME)

    def test_isAlwaysNull(self):
        self.check.isAlwaysNull(self.COLUMN_NAME)
        self.jvmCheck.isAlwaysNull.assert_called_with(self.COLUMN_NAME)

    def test_isConvertibleTo(self):
        target_type = Mock()
        target_type.json = Mock(return_value="json value")
        jvm_type = Mock()
        self.check._jvm.org.apache.spark.sql.types.DataType.fromJson = Mock(
            return_value=jvm_type
        )

        self.check.isConvertibleTo(self.COLUMN_NAME, target_type)

        target_type.json.assert_called()
        self.check._jvm.org.apache.spark.sql.types.DataType.fromJson.\
            assert_called_with("json value")
        self.jvmCheck.isConvertibleTo.assert_called_with(
            self.COLUMN_NAME,
            jvm_type
        )

    def test_isFormattedAsDate(self):
        date_format = "yyyy-MM-dd HH:mm:ss"
        self.check.isFormattedAsDate(self.COLUMN_NAME, date_format)
        self.jvmCheck.isFormattedAsDate.assert_called_with(self.COLUMN_NAME,
                                                           date_format)

    def test_isAnyOf(self):
        allowed = ("a", "b", "c")
        jvm_allowed = Mock()
        self.check._jvm.scala.collection.JavaConversions.\
            iterableAsScalaIterable().toSet = Mock(
                return_value=jvm_allowed
        )
        self.check.isAnyOf(self.COLUMN_NAME, allowed)
        self.jvmCheck.isAnyOf.assert_called_with(self.COLUMN_NAME, jvm_allowed)

    def test_isMatchingRegex(self):
        regex = "^regex$"
        self.check.isMatchingRegex(self.COLUMN_NAME, regex)
        self.jvmCheck.isMatchingRegex.assert_called_with(self.COLUMN_NAME, regex)

    def test_hasFunctionalDepdendency(self):
        determinant_set = ["column1", "column2"]
        dependent_set = ["column3", "column4"]

        jvm_determinant_set = Mock()
        jvm_dependent_set = Mock()
        self.check._jvm.scala.collection.JavaConversions.\
            iterableAsScalaIterable().toList = Mock(
                side_effect=[jvm_determinant_set, jvm_dependent_set]
        )

        self.check.hasFunctionalDependency(determinant_set, dependent_set)
        self.jvmCheck.hasFunctionalDependency.assert_called_with(
            jvm_determinant_set, jvm_dependent_set
        )

    def test_hasForeignKey(self):
        key_map1 = ("_1", "_1")
        key_map2 = ("_1", "_2")

        ref = Mock()
        jvm_key_map1 = Mock()
        jvm_key_map2 = Mock()

        self.check._jvm.scala.Tuple2 = Mock(
            side_effect=[jvm_key_map1, jvm_key_map2]
        )
        self.check._jvm.scala.collection.JavaConversions.\
            iterableAsScalaIterable().toList = Mock(
                return_value=[jvm_key_map2]
        )
        self.check.hasForeignKey(ref, key_map1, key_map2)
        self.jvmCheck.hasForeignKey.assert_called_with(
            ref._jdf, jvm_key_map1, [jvm_key_map2]
        )

    def test_isJoinableWith(self):
        key_map1 = ("_1", "_1")
        key_map2 = ("_1", "_2")

        ref = Mock()
        jvm_key_map1 = Mock()
        jvm_key_map2 = Mock()

        self.check._jvm.scala.Tuple2 = Mock(
            side_effect=[jvm_key_map1, jvm_key_map2]
        )
        self.check._jvm.scala.collection.JavaConversions.\
            iterableAsScalaIterable().toList = Mock(
                return_value=[jvm_key_map2]
        )
        self.check.isJoinableWith(ref, key_map1, key_map2)
        self.jvmCheck.isJoinableWith.assert_called_with(
            ref._jdf, jvm_key_map1, [jvm_key_map2]
        )

    def test_satisfies(self):
        constraint = "_1 > 10"
        self.check.satisfies(constraint)
        self.jvmCheck.satisfies.assert_called_with(constraint)

    def test_isEqualTo(self):
        df2 = Mock()
        self.check.isEqualTo(df2)
        self.jvmCheck.isEqualTo.assert_called_with(df2._jdf)
class ConstraintTest(unittest.TestCase):
    COLUMN_NAME = "column name"

    def setUp(self):
        df = get_df()
        self.check = Check(df)
        self.jvmCheck = self.check.jvmCheck

    def test_hasUniqueKey(self):
        column_names = ["a", "b"]
        jvm_column_names = Mock()
        self.check._jvm.scala.collection.JavaConversions.\
            iterableAsScalaIterable().toList = Mock(
                return_value=jvm_column_names
        )
        self.check.hasUniqueKey(self.COLUMN_NAME, column_names)
        self.jvmCheck.hasUniqueKey.assert_called_with(
            self.COLUMN_NAME, jvm_column_names
        )

    def test_hasNumRowsEqualTo(self):
        num_rows = 10
        self.check.hasNumRowsEqualTo(num_rows)
        self.check._jvm.de.frosner.ddq.constraints.NumberOfRowsConstraint.\
            equalTo.assert_called_with(num_rows)

    def test_hasNumRowsGreaterThan(self):
        num_rows = 10
        self.check.hasNumRowsGreaterThan(num_rows)
        self.check._jvm.de.frosner.ddq.constraints.NumberOfRowsConstraint.\
            greaterThan.assert_called_with(num_rows)

    def test_hasNumRowsLessThan(self):
        num_rows = 10
        self.check.hasNumRowsLessThan(num_rows)
        self.check._jvm.de.frosner.ddq.constraints.NumberOfRowsConstraint.\
            lessThan.assert_called_with(num_rows)

    def test_isNeverNull(self):
        self.check.isNeverNull(self.COLUMN_NAME)
        self.jvmCheck.isNeverNull.assert_called_with(self.COLUMN_NAME)

    def test_isAlwaysNull(self):
        self.check.isAlwaysNull(self.COLUMN_NAME)
        self.jvmCheck.isAlwaysNull.assert_called_with(self.COLUMN_NAME)

    def test_isConvertibleTo(self):
        target_type = Mock()
        target_type.json = Mock(return_value="json value")
        jvm_type = Mock()
        self.check._jvm.org.apache.spark.sql.types.DataType.fromJson = Mock(
            return_value=jvm_type
        )

        self.check.isConvertibleTo(self.COLUMN_NAME, target_type)

        target_type.json.assert_called()
        self.check._jvm.org.apache.spark.sql.types.DataType.fromJson.\
            assert_called_with("json value")
        self.jvmCheck.isConvertibleTo.assert_called_with(
            self.COLUMN_NAME,
            jvm_type
        )

    def test_isFormattedAsDate(self):
        date_format = "yyyy-MM-dd HH:mm:ss"
        self.check.isFormattedAsDate(self.COLUMN_NAME, date_format)
        self.jvmCheck.isFormattedAsDate.assert_called_with(self.COLUMN_NAME,
                                                           date_format)

    def test_isAnyOf(self):
        allowed = ("a", "b", "c")
        jvm_allowed = Mock()
        self.check._jvm.scala.collection.JavaConversions.\
            iterableAsScalaIterable().toSet = Mock(
                return_value=jvm_allowed
        )
        self.check.isAnyOf(self.COLUMN_NAME, allowed)
        self.jvmCheck.isAnyOf.assert_called_with(self.COLUMN_NAME, jvm_allowed)

    def test_isMatchingRegex(self):
        regex = "^regex$"
        self.check.isMatchingRegex(self.COLUMN_NAME, regex)
        self.jvmCheck.isMatchingRegex.assert_called_with(self.COLUMN_NAME, regex)

    def test_hasFunctionalDepdendency(self):
        determinant_set = ["column1", "column2"]
        dependent_set = ["column3", "column4"]

        jvm_determinant_set = Mock()
        jvm_dependent_set = Mock()
        self.check._jvm.scala.collection.JavaConversions.\
            iterableAsScalaIterable().toList = Mock(
                side_effect=[jvm_determinant_set, jvm_dependent_set]
        )

        self.check.hasFunctionalDependency(determinant_set, dependent_set)
        self.jvmCheck.hasFunctionalDependency.assert_called_with(
            jvm_determinant_set, jvm_dependent_set
        )

    def test_hasForeignKey(self):
        key_map1 = ("_1", "_1")
        key_map2 = ("_1", "_2")

        ref = Mock()
        jvm_key_map1 = Mock()
        jvm_key_map2 = Mock()

        self.check._jvm.scala.Tuple2 = Mock(
            side_effect=[jvm_key_map1, jvm_key_map2]
        )
        self.check._jvm.scala.collection.JavaConversions.\
            iterableAsScalaIterable().toList = Mock(
                return_value=[jvm_key_map2]
        )
        self.check.hasForeignKey(ref, key_map1, key_map2)
        self.jvmCheck.hasForeignKey.assert_called_with(
            ref._jdf, jvm_key_map1, [jvm_key_map2]
        )

    def test_isJoinableWith(self):
        key_map1 = ("_1", "_1")
        key_map2 = ("_1", "_2")

        ref = Mock()
        jvm_key_map1 = Mock()
        jvm_key_map2 = Mock()

        self.check._jvm.scala.Tuple2 = Mock(
            side_effect=[jvm_key_map1, jvm_key_map2]
        )
        self.check._jvm.scala.collection.JavaConversions.\
            iterableAsScalaIterable().toList = Mock(
                return_value=[jvm_key_map2]
        )
        self.check.isJoinableWith(ref, key_map1, key_map2)
        self.jvmCheck.isJoinableWith.assert_called_with(
            ref._jdf, jvm_key_map1, [jvm_key_map2]
        )

    def test_satisfies(self):
        constraint = "_1 > 10"
        self.check.satisfies(constraint)
        self.jvmCheck.satisfies.assert_called_with(constraint)

    def test_isEqualTo(self):
        df2 = Mock()
        self.check.isEqualTo(df2)
        self.jvmCheck.isEqualTo.assert_called_with(df2._jdf)