Browse Source

add basic sequential schedule validator tests

pull/2655/head
Jason Dove 8 months ago
parent
commit
8250091fc2
No known key found for this signature in database
  1. 6
      ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj
  2. 200
      ErsatzTV.Infrastructure.Tests/Scheduling/SequentialScheduleValidatorTests.cs
  3. 8
      ErsatzTV.Infrastructure/Scheduling/SequentialScheduleValidator.cs

6
ErsatzTV.Infrastructure.Tests/ErsatzTV.Infrastructure.Tests.csproj

@ -29,4 +29,10 @@ @@ -29,4 +29,10 @@
<ProjectReference Include="..\ErsatzTV.Infrastructure\ErsatzTV.Infrastructure.csproj" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="..\ErsatzTV\Resources\sequential-schedule.schema.json">
<Link>Resources/sequential-schedule.schema.json</Link>
</EmbeddedResource>
</ItemGroup>
</Project>

200
ErsatzTV.Infrastructure.Tests/Scheduling/SequentialScheduleValidatorTests.cs

@ -0,0 +1,200 @@ @@ -0,0 +1,200 @@
using System.Reflection;
using ErsatzTV.Core;
using ErsatzTV.Infrastructure.Scheduling;
using Microsoft.Extensions.Logging;
using NSubstitute;
using NUnit.Framework;
using Shouldly;
using Testably.Abstractions.Testing;
namespace ErsatzTV.Infrastructure.Tests.Scheduling;
[TestFixture]
public class SequentialScheduleValidatorTests
{
private readonly string _schema;
public SequentialScheduleValidatorTests()
{
var assembly = Assembly.GetAssembly(typeof(SequentialScheduleValidatorTests));
assembly.ShouldNotBeNull();
using var stream = assembly.GetManifestResourceStream(
"ErsatzTV.Infrastructure.Tests.Resources.sequential-schedule.schema.json");
stream.ShouldNotBeNull();
using var reader = new StreamReader(stream);
_schema = reader.ReadToEnd();
}
[CancelAfter(2_000)]
[Test]
public async Task ValidateSchedule_Should_Succeed_Valid_Schedule(CancellationToken cancellationToken)
{
const string YAML =
"""
content:
- show:
key: "SOME_SHOW"
guids:
- source: "imdb"
value: "tt123456"
order: chronological
- search:
key: "FILLER"
query: "type:other_video"
order: "shuffle"
reset:
- wait_until: '8:00am'
tomorrow: false
rewind_on_reset: true
playout:
- duration: "30 minutes"
content: "SOME_SHOW"
discard_attempts: 2
offline_tail: false
- epg_group: true
advance: false
- pad_to_next: 30
content: "FILLER"
filler_kind: postroll
trim: true
- epg_group: false
- repeat: true
""";
string schemaFileName = Path.Combine(FileSystemLayout.ResourcesCacheFolder, "sequential-schedule.schema.json");
var fileSystem = new MockFileSystem();
fileSystem.Initialize()
.WithFile(schemaFileName).Which(f => f.HasStringContent(_schema));
var validator = new SequentialScheduleValidator(
fileSystem,
Substitute.For<ILogger<SequentialScheduleValidator>>());
bool result = await validator.ValidateSchedule(YAML, false);
result.ShouldBeTrue();
}
[CancelAfter(2_000)]
[Test]
public async Task ValidateSchedule_Should_Fail_Invalid_Schedule(CancellationToken cancellationToken)
{
const string YAML =
"""
content:
- show:
key: "SOME_SHOW"
guids22:
- source: "imdb"
value: "tt123456"
order: chronological
- search:
key: "FILLER"
query: "type:other_video"
order: "shuffle"
reset:
- wait_until: '8:00am'
tomorrow: false
rewind_on_reset: true
playout:
- duration: "30 minutes"
content: "SOME_SHOW"
discard_attempts: 2
offline_tail: false
- epg_group: true
advance: false
- pad_to_next: 30
content: "FILLER"
filler_kind: postroll
trim: true
- epg_group: false
- repeat: true
""";
string schemaFileName = Path.Combine(FileSystemLayout.ResourcesCacheFolder, "sequential-schedule.schema.json");
var fileSystem = new MockFileSystem();
fileSystem.Initialize()
.WithFile(schemaFileName).Which(f => f.HasStringContent(_schema));
var validator = new SequentialScheduleValidator(
fileSystem,
Substitute.For<ILogger<SequentialScheduleValidator>>());
bool result = await validator.ValidateSchedule(YAML, false);
result.ShouldBeFalse();
}
[CancelAfter(2_000)]
[Test]
public async Task GetValidationMessages_With_Invalid_Schedule(CancellationToken cancellationToken)
{
const string YAML =
"""
content:
- show:
key: "SOME_SHOW"
guids22:
- source: "imdb"
value: "tt123456"
order: chronological
- search:
key: "FILLER"
query: "type:other_video"
order: "shuffle"
reset:
- wait_until: '8:00am'
tomorrow: false
rewind_on_reset: true
playout:
- duration: "30 minutes"
content: "SOME_SHOW"
discard_attempts: 2
offline_tail: false
- epg_group: true
advance: false
- pad_to_next: 30
content: "FILLER"
filler_kind: postroll
trim: true
- epg_group: false
- repeat: true
""";
string schemaFileName = Path.Combine(FileSystemLayout.ResourcesCacheFolder, "sequential-schedule.schema.json");
var fileSystem = new MockFileSystem();
fileSystem.Initialize()
.WithFile(schemaFileName).Which(f => f.HasStringContent(_schema));
var validator = new SequentialScheduleValidator(
fileSystem,
Substitute.For<ILogger<SequentialScheduleValidator>>());
IList<string> result = await validator.GetValidationMessages(YAML, false);
result.ShouldNotBeNull();
result.Count.ShouldBe(1);
result[0].ShouldContain("line 3");
result[0].ShouldContain("position 5");
}
}

8
ErsatzTV.Infrastructure/Scheduling/SequentialScheduleValidator.cs

@ -1,4 +1,5 @@ @@ -1,4 +1,5 @@
using System.Globalization;
using System.IO.Abstractions;
using System.Text.Json;
using ErsatzTV.Core;
using ErsatzTV.Core.Interfaces.Scheduling;
@ -11,7 +12,8 @@ using JsonSerializer = System.Text.Json.JsonSerializer; @@ -11,7 +12,8 @@ using JsonSerializer = System.Text.Json.JsonSerializer;
namespace ErsatzTV.Infrastructure.Scheduling;
public class SequentialScheduleValidator(ILogger<SequentialScheduleValidator> logger) : ISequentialScheduleValidator
public class SequentialScheduleValidator(IFileSystem fileSystem, ILogger<SequentialScheduleValidator> logger)
: ISequentialScheduleValidator
{
public async Task<bool> ValidateSchedule(string yaml, bool isImport)
{
@ -20,7 +22,7 @@ public class SequentialScheduleValidator(ILogger<SequentialScheduleValidator> lo @@ -20,7 +22,7 @@ public class SequentialScheduleValidator(ILogger<SequentialScheduleValidator> lo
string schemaFileName = Path.Combine(
FileSystemLayout.ResourcesCacheFolder,
isImport ? "sequential-schedule-import.schema.json" : "sequential-schedule.schema.json");
using StreamReader sr = File.OpenText(schemaFileName);
using StreamReader sr = fileSystem.File.OpenText(schemaFileName);
await using var reader = new JsonTextReader(sr);
var schema = JSchema.Load(reader);
@ -63,7 +65,7 @@ public class SequentialScheduleValidator(ILogger<SequentialScheduleValidator> lo @@ -63,7 +65,7 @@ public class SequentialScheduleValidator(ILogger<SequentialScheduleValidator> lo
string schemaFileName = Path.Combine(
FileSystemLayout.ResourcesCacheFolder,
isImport ? "sequential-schedule-import.schema.json" : "sequential-schedule.schema.json");
using StreamReader sr = File.OpenText(schemaFileName);
using StreamReader sr = fileSystem.File.OpenText(schemaFileName);
await using var reader = new JsonTextReader(sr);
var schema = JSchema.Load(reader);

Loading…
Cancel
Save