fix: Add QP validation for groups with less than 2 qualities

spectre-console-remove-di-hacks
Robert Dailey 7 months ago
parent 8060096ba8
commit 010b5f9513

@ -10,7 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed
- Sync file naming configuration even if `rename` is not set to `true`.
- Media Naming: Sync file naming configuration even if `rename` is not set to `true`.
- Quality Profiles: Validation check added for quality groups with less than 2 qualities.
## [6.0.0] - 2023-09-29

@ -116,6 +116,7 @@ public class QualityProfileConfigYamlValidator : AbstractValidator<QualityProfil
RuleFor(x => x.Qualities)
.Custom(ValidateHaveNoDuplicates!)
.Custom(ValidateGroupQualityCount!)
.Must(x => x!.Any(y => y.Enabled is true or null))
.WithMessage(x =>
$"For profile {x.Name}, at least one explicitly listed quality under 'qualities' must be enabled.")
@ -137,6 +138,22 @@ public class QualityProfileConfigYamlValidator : AbstractValidator<QualityProfil
.When(x => x is {Upgrade.Allowed: not false, Qualities.Count: > 0});
}
private static void ValidateGroupQualityCount(
IReadOnlyCollection<QualityProfileQualityConfigYaml> qualities,
ValidationContext<QualityProfileConfigYaml> context)
{
// Find groups with less than 2 items
var invalidCount = qualities
.Count(x => x.Qualities?.Count < 2);
if (invalidCount != 0)
{
var profile = context.InstanceToValidate;
context.AddFailure(
$"For profile {profile.Name}, 'qualities' contains {invalidCount} groups with less than 2 qualities");
}
}
private static void ValidateHaveNoDuplicates(
IReadOnlyCollection<QualityProfileQualityConfigYaml> qualities,
ValidationContext<QualityProfileConfigYaml> context)

@ -174,4 +174,83 @@ public class ConfigYamlDataObjectsValidationTest
result.Errors.Select(x => x.ErrorMessage).Should().BeEquivalentTo(
$"For profile {data.Name}, 'until_quality' must not refer to explicitly disabled qualities");
}
[Test]
public void Empty_qualities_in_groups_not_allowed()
{
var data = new QualityProfileConfigYaml
{
Name = "Profile",
Qualities = new[]
{
new QualityProfileQualityConfigYaml
{
Name = "Group",
Qualities = Array.Empty<string>()
}
}
};
var validator = new QualityProfileConfigYamlValidator();
var result = validator.TestValidate(data);
result.ShouldHaveValidationErrorFor(x => x.Qualities);
result.Errors.Select(x => x.ErrorMessage).Should().BeEquivalentTo(
$"For profile {data.Name}, 'qualities' contains 1 groups with less than 2 qualities");
}
[Test]
public void Only_one_quality_in_groups_not_allowed()
{
var data = new QualityProfileConfigYaml
{
Name = "Profile",
Qualities = new[]
{
new QualityProfileQualityConfigYaml
{
Name = "Group",
Qualities = new[]
{
"One Quality"
}
}
}
};
var validator = new QualityProfileConfigYamlValidator();
var result = validator.TestValidate(data);
result.ShouldHaveValidationErrorFor(x => x.Qualities);
result.Errors.Select(x => x.ErrorMessage).Should().BeEquivalentTo(
$"For profile {data.Name}, 'qualities' contains 1 groups with less than 2 qualities");
}
[Test]
public void Two_qualities_in_group_passes_validation()
{
var data = new QualityProfileConfigYaml
{
Name = "Profile",
Qualities = new[]
{
new QualityProfileQualityConfigYaml
{
Name = "Group",
Qualities = new[]
{
"One Quality",
"Two Quality"
}
}
}
};
var validator = new QualityProfileConfigYamlValidator();
var result = validator.TestValidate(data);
result.ShouldNotHaveAnyValidationErrors();
}
}

Loading…
Cancel
Save