Skip to content
This repository has been archived by the owner on Apr 14, 2023. It is now read-only.

Commit

Permalink
fix(#1675): Update validation checks for if-else and inMap
Browse files Browse the repository at this point in the history
  • Loading branch information
matthewdunsdon committed Jul 17, 2020
1 parent 670eb1d commit d07d725
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,22 @@ Feature: User can specify that a field value belongs to a set of predetermined o
| "Scotland" | "Edinburgh" | 2 | "two" |
| "Wales" | "Cardiff" | 1 | "one" |
| "Wales" | "Cardiff" | 2 | "two" |


Scenario: Running an 'inMap' with text a restriction
Given the following non nullable fields exist:
| HomeNation |
| Population |
And the file "testFile" contains the following data:
| Country | Population |
| England | 56286961 |
| Scotland | 5463300 |
| Wales | ~3150000 |
| Northern Ireland | TBC |
And HomeNation has type "string"
And Population has type "integer"
And HomeNation is from Country in testFile
And Population is from Population in testFile
But the profile is invalid with errors:
| Value '~3150000' must be a number \| Constraint: 'inMap' |
| Value 'TBC' must be a number \| Constraint: 'inMap' |
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,19 @@ public void profileIsInvalidWithErrorMessage(String expectedError)
}
}

@But("^the profile is invalid with errors:$")
public void profileIsInvalidWithErrorMessages(List<String> expectedErrors)
{
state.expectExceptions = true;
cucumberTestHelper.generateAndGetData();

List<String> errors = this.cucumberTestHelper
.getProfileValidationErrors()
.collect(Collectors.toList());

Assert.assertThat("Expected profile validation errors", errors, containsInAnyOrder(expectedErrors.toArray()));
}

@But("^the profile is invalid with error containing \"(.+)\"$")
public void profileIsInvalidWithErrorContainingErrorMessage(String expectedError)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

import java.util.List;

public class ConditionalConstraintValidator extends GrammaticalConstraintValidator<ConditionalConstraintDTO>
public class ConditionalConstraintValidator extends GrammaticalConstraintValidator<ConditionalConstraintDTO>
{
public ConditionalConstraintValidator(List<FieldDTO> fields)
{
Expand All @@ -38,7 +38,7 @@ public ValidationResult validate(ConditionalConstraintDTO conditionalConstraint)
: validateConstraint(conditionalConstraint.thenConstraint, fields);
ValidationResult validateElseConstraint = conditionalConstraint.elseConstraint == null
? ValidationResult.success()
:validateConstraint(conditionalConstraint.ifConstraint, fields);
: validateConstraint(conditionalConstraint.elseConstraint, fields);

return ValidationResult.combine(validateIfConstraint, validateThenConstraint, validateElseConstraint);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,13 @@

package com.scottlogic.datahelix.generator.profile.validators.profile.constraints.relations;

import com.scottlogic.datahelix.generator.common.profile.FieldType;
import com.scottlogic.datahelix.generator.common.validators.ValidationResult;
import com.scottlogic.datahelix.generator.profile.dtos.FieldDTO;
import com.scottlogic.datahelix.generator.profile.dtos.constraints.relations.InMapConstraintDTO;
import com.scottlogic.datahelix.generator.profile.validators.profile.ConstraintValidator;
import com.scottlogic.datahelix.generator.profile.validators.profile.FieldValidator;
import com.scottlogic.datahelix.generator.profile.validators.profile.constraints.capabilities.ValueTypeValidator;

import java.util.List;
import java.util.Optional;
Expand All @@ -34,7 +37,10 @@ public InMapConstraintValidator(List<FieldDTO> fields)
@Override
public ValidationResult validate(InMapConstraintDTO inMapConstraint)
{
return ValidationResult.combine(fieldMustBeValid(inMapConstraint), valuesMustBeSpecified(inMapConstraint));
ValidationResult validationResult = ValidationResult.combine(fieldMustBeValid(inMapConstraint), valuesMustBeSpecified(inMapConstraint));
if (!validationResult.isSuccess) return validationResult;

return fieldTypeMustBeValid(inMapConstraint);
}

private ValidationResult fieldMustBeValid(InMapConstraintDTO dto)
Expand All @@ -57,4 +63,11 @@ private ValidationResult valuesMustBeSpecified(InMapConstraintDTO inMapConstrain
? ValidationResult.success()
: ValidationResult.failure("Values must be specified" + getErrorInfo(inMapConstraint));
}

private ValidationResult fieldTypeMustBeValid(InMapConstraintDTO dto)
{
FieldType fieldType = FieldValidator.getSpecificFieldType(getField(dto.field)).getFieldType();
ValueTypeValidator valueTypeValidator = new ValueTypeValidator(fieldType, getErrorInfo(dto));
return ValidationResult.combine(dto.values.stream().map(valueTypeValidator::validate));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import com.scottlogic.datahelix.generator.profile.creation.FieldDTOBuilder;
import com.scottlogic.datahelix.generator.profile.dtos.FieldDTO;
import com.scottlogic.datahelix.generator.profile.dtos.constraints.grammatical.ConditionalConstraintDTO;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

import java.util.Arrays;
Expand Down Expand Up @@ -143,8 +142,6 @@ public void validateConditionalConstraint_withInvalidThenConstraint_fails()
assertThat(validationResult.errors, hasItem("'unknown' must be defined in fields | Field: 'unknown' | Constraint: 'isNull'"));
}

// TODO: should fail, but is successful
@Disabled
@Test
public void validateConditionalConstraint_withInvalidElseConstraint_fails()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import com.scottlogic.datahelix.generator.profile.creation.FieldDTOBuilder;
import com.scottlogic.datahelix.generator.profile.dtos.FieldDTO;
import com.scottlogic.datahelix.generator.profile.dtos.constraints.relations.InMapConstraintDTO;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;

import java.util.Arrays;
Expand Down Expand Up @@ -134,8 +133,6 @@ public void validateInMapConstraint_withNullValue_fails()
assertThat(validationResult.errors, hasItem("Values must be specified | Constraint: 'inMap'"));
}

// TODO: Type checking of value list is missing
@Disabled
@Test
public void validateInMapConstraint_withInvalidData_fails()
{
Expand All @@ -147,7 +144,7 @@ public void validateInMapConstraint_withInvalidData_fails()
// Assert
assertFalse(validationResult.isSuccess);
assertThat(validationResult.errors, iterableWithSize(2));
assertThat(validationResult.errors, hasItem("Value 1.1 must be a string | Field: 'text' | Constraint: 'inMap'"));
assertThat(validationResult.errors, hasItem("Value true must be a string | Field: 'text' | Constraint: 'inMap'"));
assertThat(validationResult.errors, hasItem("Value 1.1 must be a string | Constraint: 'inMap'"));
assertThat(validationResult.errors, hasItem("Value true must be a string | Constraint: 'inMap'"));
}
}

0 comments on commit d07d725

Please sign in to comment.