@@ -22,10 +22,9 @@ import com.amazon.deequ.anomalydetection.AbsoluteChangeStrategy
22
22
import com .amazon .deequ .checks .Check
23
23
import com .amazon .deequ .checks .CheckLevel
24
24
import com .amazon .deequ .checks .CheckStatus
25
- import com .amazon .deequ .constraints .Constraint
25
+ import com .amazon .deequ .constraints .{ Constraint , ConstraintResult }
26
26
import com .amazon .deequ .io .DfsUtils
27
- import com .amazon .deequ .metrics .DoubleMetric
28
- import com .amazon .deequ .metrics .Entity
27
+ import com .amazon .deequ .metrics .{DoubleMetric , Entity , Metric }
29
28
import com .amazon .deequ .repository .MetricsRepository
30
29
import com .amazon .deequ .repository .ResultKey
31
30
import com .amazon .deequ .repository .memory .InMemoryMetricsRepository
@@ -849,6 +848,55 @@ class VerificationSuiteTest extends WordSpec with Matchers with SparkContextSpec
849
848
assert(checkFailedCompletenessResult.status == CheckStatus .Error )
850
849
}
851
850
851
+ " Well-defined checks should produce correct result even if another check throws an exception" in withSparkSession {
852
+ sparkSession =>
853
+ val df = getDfWithNameAndAge(sparkSession)
854
+
855
+
856
+ val checkThatShouldSucceed =
857
+ Check (CheckLevel .Error , " shouldSucceedForValue" ).isComplete(" name" )
858
+
859
+
860
+ val checkThatWillThrow = Check (CheckLevel .Error , " shouldThrow" )
861
+ .hasSize(_ => {
862
+ throw new IllegalArgumentException (" borked" )
863
+ })
864
+
865
+ val complianceCheckThatShouldSucceed =
866
+ Check (CheckLevel .Error , " shouldSucceedForAge" ).isContainedIn(" age" , 1 , 100 )
867
+
868
+
869
+ val isCompleteCheckThatShouldFailCompleteness = Check (CheckLevel .Error , " shouldErrorStringType" )
870
+ .isComplete(" fake" )
871
+
872
+ val verificationResult = VerificationSuite ()
873
+ .onData(df)
874
+ .addCheck(checkThatShouldSucceed)
875
+ .addCheck(checkThatWillThrow)
876
+ .addCheck(isCompleteCheckThatShouldFailCompleteness)
877
+ .addCheck(complianceCheckThatShouldSucceed)
878
+ .run()
879
+
880
+ val checkSuccessResult = verificationResult.checkResults(checkThatShouldSucceed)
881
+ checkSuccessResult.constraintResults.map(_.message) shouldBe List (None )
882
+ assert(checkSuccessResult.status == CheckStatus .Success )
883
+
884
+ val checkExceptionResult = verificationResult.checkResults(checkThatWillThrow)
885
+ checkExceptionResult.constraintResults.map(_.message) shouldBe
886
+ List (Some (" Can't execute the assertion: borked!" ))
887
+ assert(checkExceptionResult.status == CheckStatus .Error )
888
+
889
+ val checkIsCompleteFailedResult = verificationResult.checkResults(isCompleteCheckThatShouldFailCompleteness)
890
+ checkIsCompleteFailedResult.constraintResults.map(_.message) shouldBe
891
+ List (Some (" Input data does not include column fake!" ))
892
+ assert(checkIsCompleteFailedResult.status == CheckStatus .Error )
893
+
894
+ val checkAgeSuccessResult = verificationResult.checkResults(complianceCheckThatShouldSucceed)
895
+ checkAgeSuccessResult.constraintResults.map(_.message) shouldBe List (None )
896
+ assert(checkAgeSuccessResult.status == CheckStatus .Success )
897
+
898
+ }
899
+
852
900
" A well-defined completeness check should pass even with a single column" in withSparkSession {
853
901
sparkSession =>
854
902
val df = getDfWithVariableStringLengthValues(sparkSession)
0 commit comments