Skip to content

Commit

Permalink
Adds test case for local date time
Browse files Browse the repository at this point in the history
  • Loading branch information
craigedmunds committed Feb 7, 2025
1 parent 1191407 commit 071d9d4
Show file tree
Hide file tree
Showing 17 changed files with 468 additions and 126 deletions.
4 changes: 4 additions & 0 deletions Btms.Backend.Data/Btms.Backend.Data.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
</PropertyGroup>

<ItemGroup>
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
<_Parameter1>Btms.Backend.IntegrationTests</_Parameter1>
</AssemblyAttribute>

<PackageReference Include="MongoDB.Driver" Version="2.30.0" />
<PackageReference Include="MongoDB.Driver.Core.Extensions.DiagnosticSources" Version="1.5.0" />
</ItemGroup>
Expand Down
1 change: 0 additions & 1 deletion Btms.Backend.Data/Mongo/MongoDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ public MongoDbContext(IMongoDatabase database, ILoggerFactory loggerFactory)
internal IMongoDatabase Database { get; }
internal MongoDbTransaction? ActiveTransaction { get; private set; }


public IMongoCollectionSet<ImportNotification> Notifications { get; }

public IMongoCollectionSet<Movement> Movements { get; }
Expand Down
51 changes: 51 additions & 0 deletions Btms.Backend.IntegrationTests/LocalDateTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using Btms.Backend.Data.Mongo;
using FluentAssertions;
using MongoDB.Bson;
using TestDataGenerator.Scenarios;
using TestGenerator.IntegrationTesting.Backend;
using TestGenerator.IntegrationTesting.Backend.Extensions;
using Xunit;
using Xunit.Abstractions;

namespace Btms.Backend.IntegrationTests;

[Trait("Category", "Integration")]
public class LocalDateTests(ITestOutputHelper output)
: ScenarioGeneratorBaseTest<ChedASimpleMatchFixedDatesScenarioGenerator>(output)
{
private static readonly DateTime ExpectedDateTime = new DateTime(2024, 12, 1, 10, 10, 0, DateTimeKind.Local);

[Fact]
public void ShouldBeCorrectInApi()
{
Client
.GetSingleImportNotification()
.PartOne?.DepartedOn
.Should().Be(ExpectedDateTime);
}

[Fact]
public void ShouldBeCorrectInMongoDbContext()
{
var n = BackendFixture.MongoDbContext.Notifications.Single();

n.PartOne?.DepartedOn
.Should().Be(ExpectedDateTime);
}

[Fact]
public void ShouldBeCorrectInDatabase()
{
var command = @"{
'find': 'ImportNotification',
projection: {_id:0,'partOne.departedOn':1}
}";

var result = ((MongoDbContext)BackendFixture.MongoDbContext)
.Database.RunCommand<BsonDocument>(command);

result["cursor"]["firstBatch"][0]["partOne"]["departedOn"].AsBsonDateTime
.Should().Be(new BsonDateTime(ExpectedDateTime));

}
}
13 changes: 11 additions & 2 deletions TestDataGenerator/ScenarioGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,29 @@
using Btms.Model;
using Btms.Types.Alvs;
using Btms.Types.Ipaffs;
using Microsoft.Extensions.Logging;
using TestDataGenerator.Helpers;
using TestDataGenerator.Scenarios;
using Decision = Btms.Types.Alvs.Decision;
using Finalisation = Btms.Types.Alvs.Finalisation;

namespace TestDataGenerator;

public abstract class ScenarioGenerator
public abstract class ScenarioGenerator(ILogger logger)
{
protected readonly ILogger Logger = logger;

private readonly string _fullFolder =
$"{Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory)}/Scenarios/Samples";

public abstract GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config);


protected virtual List<object> ModifyMessages(
List<object> messages)
{
return messages;
}

/// <summary>
/// A class to hold a list of message types we support. Would be nice to use something
/// other than object :|
Expand Down
32 changes: 16 additions & 16 deletions TestDataGenerator/Scenarios/CRNoMatch.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public static DecisionBuilder<Decision> GetDecisionBuilder(
}
}

public class CrNoMatchSingleItemWithDecisionScenarioGenerator(ILogger<CrNoMatchNoChecksScenarioGenerator> logger) : ScenarioGenerator
public class CrNoMatchSingleItemWithDecisionScenarioGenerator(ILogger<CrNoMatchNoChecksScenarioGenerator> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
Expand All @@ -64,18 +64,18 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithDispatchCountryCode("FR")
.ValidateAndBuild();

logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);

var alvsDecision = clearanceRequest
.GetDecisionBuilder()
.ValidateAndBuild();

logger.LogInformation("Created {EntryReference}", alvsDecision.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", alvsDecision.Header!.EntryReference);

return new GeneratorResult([clearanceRequest, alvsDecision]);
}
}
public class CrNoMatchNoChecksScenarioGenerator(ILogger<CrNoMatchNoChecksScenarioGenerator> logger) : ScenarioGenerator
public class CrNoMatchNoChecksScenarioGenerator(ILogger<CrNoMatchNoChecksScenarioGenerator> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
Expand All @@ -93,13 +93,13 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.ToArray();
})
.ValidateAndBuild();
logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);

return new GeneratorResult([clearanceRequest]);
}
}

public class CrNoMatchNoDecisionScenarioGenerator(ILogger<CrNoMatchScenarioGenerator> logger) : ScenarioGenerator
public class CrNoMatchNoDecisionScenarioGenerator(ILogger<CrNoMatchScenarioGenerator> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
Expand All @@ -111,13 +111,13 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithRandomItems(10, 100)
.ValidateAndBuild();

logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);

return new GeneratorResult([clearanceRequest]);
}
}

public class CrNoMatchScenarioGenerator(ILogger<CrNoMatchScenarioGenerator> logger) : ScenarioGenerator
public class CrNoMatchScenarioGenerator(ILogger<CrNoMatchScenarioGenerator> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
Expand All @@ -126,26 +126,26 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithRandomItems(10, 100)
.ValidateAndBuild();

logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);

var alvsDecision = clearanceRequest
.GetDecisionBuilder()
.ValidateAndBuild();

logger.LogInformation("Created {EntryReference}", alvsDecision.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", alvsDecision.Header!.EntryReference);

return new GeneratorResult([clearanceRequest, alvsDecision]);
}
}

public class CrNoMatchNonContiguousDecisionsScenarioGenerator(ILogger<CrNoMatchNonContiguousDecisionsScenarioGenerator> logger) : ScenarioGenerator
public class CrNoMatchNonContiguousDecisionsScenarioGenerator(ILogger<CrNoMatchNonContiguousDecisionsScenarioGenerator> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
var clearanceRequest = NoMatchExtensions
.CompleteSimpleClearanceRequest(scenario, item, entryDate, config);

logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);

var alvsDecisionBuilder = clearanceRequest
.GetDecisionBuilder()
Expand All @@ -159,27 +159,27 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithDecisionVersionNumber(3)
.ValidateAndBuild();

logger.LogInformation("Created {EntryReference}", alvsDecision.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", alvsDecision.Header!.EntryReference);

return new GeneratorResult([clearanceRequest, alvsDecision, alvsDecision2]);
}
}

public class CrDecisionWithoutV1ScenarioGenerator(ILogger<CrDecisionWithoutV1ScenarioGenerator> logger) : ScenarioGenerator
public class CrDecisionWithoutV1ScenarioGenerator(ILogger<CrDecisionWithoutV1ScenarioGenerator> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
var clearanceRequest = NoMatchExtensions
.CompleteSimpleClearanceRequest(scenario, item, entryDate, config);

logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);

var alvsDecision = clearanceRequest
.GetDecisionBuilder()
.WithDecisionVersionNumber(2)
.Build();

logger.LogInformation("Created {EntryReference}", alvsDecision.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", alvsDecision.Header!.EntryReference);

return new GeneratorResult([clearanceRequest, alvsDecision]);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace TestDataGenerator.Scenarios;

public class ChedAManyCommoditiesScenarioGenerator(ILogger<ChedAManyCommoditiesScenarioGenerator> logger)
: ScenarioGenerator
: ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
Expand Down
4 changes: 2 additions & 2 deletions TestDataGenerator/Scenarios/ChedANoMatchScenarioGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace TestDataGenerator.Scenarios;

public class ChedANoMatchScenarioGenerator(ILogger<ChedANoMatchScenarioGenerator> logger) : ScenarioGenerator
public class ChedANoMatchScenarioGenerator(ILogger<ChedANoMatchScenarioGenerator> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
Expand All @@ -15,7 +15,7 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithVersionNumber()
.ValidateAndBuild();

logger.LogInformation("Created {NotificationReferenceNumber}",
Logger.LogInformation("Created {NotificationReferenceNumber}",
notification.ReferenceNumber);

return new GeneratorResult([notification]);
Expand Down
24 changes: 22 additions & 2 deletions TestDataGenerator/Scenarios/ChedASimpleMatchScenarioGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace TestDataGenerator.Scenarios;

public class ChedASimpleMatchScenarioGenerator(ILogger<ChedASimpleMatchScenarioGenerator> logger) : ScenarioGenerator
public class ChedASimpleMatchScenarioGenerator(ILogger<ChedASimpleMatchScenarioGenerator> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
Expand Down Expand Up @@ -33,7 +33,27 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.ValidateAndBuild();

logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);

var messages = new List<object>() { clearanceRequest, notification, finalisation };

return new GeneratorResult(ModifyMessages(messages).ToArray());
}
}

public class ChedASimpleMatchFixedDatesScenarioGenerator(ILogger<ChedASimpleMatchScenarioGenerator> logger)
: ChedASimpleMatchScenarioGenerator(logger)
{
protected override List<object> ModifyMessages(List<object> messages)
{
messages.ForEach(m =>
{
if (m is ImportNotification)
{
((ImportNotification)m).PartOne!.DepartureDate = new DateOnly(2024, 12, 1);
((ImportNotification)m).PartOne!.DepartureTime = new TimeOnly(10, 10, 0);
}
});

return new GeneratorResult([clearanceRequest, notification, finalisation]);
return messages;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace TestDataGenerator.Scenarios.ChedP;

public class ClearLinksDueToMrnDocumentRefChange(ILogger<ClearLinksDueToMrnDocumentRefChange> logger) : ScenarioGenerator
public class ClearLinksDueToMrnDocumentRefChange(ILogger<ClearLinksDueToMrnDocumentRefChange> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
Expand All @@ -17,7 +17,7 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithVersionNumber()
.ValidateAndBuild();

logger.LogInformation("Created {NotificationReferenceNumber}",
Logger.LogInformation("Created {NotificationReferenceNumber}",
notification.ReferenceNumber);

var clearanceRequestBuilder = BuilderHelpers.GetClearanceRequestBuilder("cr-one-item")
Expand All @@ -36,7 +36,7 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithItemDocumentRef("GBCHD2024.001239999999") // Updating to trigger a no match
.Build();

logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);

return new GeneratorResult([clearanceRequest, notification, updatedClearanceRequest]);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace TestDataGenerator.Scenarios.ChedP;

public class DuplicateDecisionScenarioGenerator(ILogger<DuplicateDecisionScenarioGenerator> logger) : ScenarioGenerator
public class DuplicateDecisionScenarioGenerator(ILogger<DuplicateDecisionScenarioGenerator> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
Expand All @@ -18,7 +18,7 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithVersionNumber()
.ValidateAndBuild();

logger.LogInformation("Created {NotificationReferenceNumber}",
Logger.LogInformation("Created {NotificationReferenceNumber}",
notification.ReferenceNumber);


Expand All @@ -30,7 +30,7 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithTunaItem()
.ValidateAndBuild();

logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);

var alvsDecision = BuilderHelpers.GetDecisionBuilder("decision-one-item")
.WithCreationDate(clearanceRequest.ServiceHeader!.ServiceCallTimestamp!.Value.AddHours(1), false)
Expand All @@ -40,7 +40,7 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithTunaChecks()
.ValidateAndBuild();

logger.LogInformation("Created {EntryReference}", alvsDecision.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", alvsDecision.Header!.EntryReference);

return new GeneratorResult([clearanceRequest, notification, alvsDecision, alvsDecision]);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace TestDataGenerator.Scenarios.ChedP;

public class MultiStepMovementScenarioGenerator(ILogger<MultiStepScenarioGenerator> logger) : ScenarioGenerator
public class MultiStepMovementScenarioGenerator(ILogger<MultiStepScenarioGenerator> logger) : ScenarioGenerator(logger)
{
public override GeneratorResult Generate(int scenario, int item, DateTime entryDate, ScenarioConfig config)
{
Expand All @@ -24,10 +24,10 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD

var notification1 = notification1Builder.Build();

logger.LogInformation("Created {NotificationReferenceNumber}",
Logger.LogInformation("Created {NotificationReferenceNumber}",
notification1.ReferenceNumber);

logger.LogInformation("Created {NotificationReferenceNumber}",
Logger.LogInformation("Created {NotificationReferenceNumber}",
notification2.ReferenceNumber);

var clearanceRequestBuilder = BuilderHelpers.GetClearanceRequestBuilder("cr-one-item")
Expand All @@ -47,7 +47,7 @@ public override GeneratorResult Generate(int scenario, int item, DateTime entryD
.WithItemDocumentRef("GBCHD2024.001239999999") // Updating to trigger a no match
.Build();

logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);
Logger.LogInformation("Created {EntryReference}", clearanceRequest.Header!.EntryReference);

return new GeneratorResult([clearanceRequest, notification1, notification2, clearanceRequestv2]);
}
Expand Down
Loading

0 comments on commit 071d9d4

Please sign in to comment.