Skip to content

Commit 33e7069

Browse files
committed
Add BookingRef V2 flag enabled/disabled tests to all the Booking Integration tests
1 parent ff85c28 commit 33e7069

11 files changed

Lines changed: 150 additions & 82 deletions

File tree

src/api/Nhs.Appointments.Core/ReferenceNumber/V2/Provider.cs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ public interface IProvider
1313
{
1414
Task<string> GetReferenceNumber();
1515

16-
bool IsValidBookingReference(string bookingReference);
17-
1816
int DeriveSequenceMultiplier(string partitionKey);
1917
}
2018

@@ -31,11 +29,6 @@ public class Provider(
3129
TimeProvider timeProvider)
3230
: IProvider
3331
{
34-
//needed for backwards compatibility since we are now checking correctly formatted strings
35-
private Regex BookingReferenceV1Regex => new (@"^\d{2}-\d{2}-\d{6}$", RegexOptions.None, TimeSpan.FromMilliseconds(100));
36-
37-
private Regex BookingReferenceV2Regex => new (@"^\d{4}-\d{5}-\d{4}$", RegexOptions.None, TimeSpan.FromMilliseconds(100));
38-
3932
private IOptions<ReferenceNumberOptions> Options { get; } = options;
4033

4134
//in generating the partition key, splitting the current day of the year into X buckets of this length
@@ -163,13 +156,28 @@ public int DeriveSequenceMultiplier(string partitionKey)
163156
//GCD(multiplier,SequenceMax) == 1 guaranteed
164157
return multiplier;
165158
}
159+
160+
internal static string FormatBookingReference(string raw)
161+
{
162+
return raw?.Length != 13
163+
? throw new ArgumentException("Must be 13 digits")
164+
: $"{raw[..4]}-{raw.Substring(4, 5)}-{raw.Substring(9, 4)}";
165+
}
166+
}
166167

168+
public static class ProviderHelper
169+
{
170+
//needed for backwards compatibility since we are now checking correctly formatted strings
171+
private static Regex BookingReferenceV1Regex => new (@"^\d{2}-\d{2}-\d{6}$", RegexOptions.None, TimeSpan.FromMilliseconds(100));
172+
173+
private static Regex BookingReferenceV2Regex => new (@"^\d{4}-\d{5}-\d{4}$", RegexOptions.None, TimeSpan.FromMilliseconds(100));
174+
167175
/// <summary>
168176
/// A quick way to check if the provided booking reference is valid,
169177
/// before firing off to the DB to try and find a record with that identifier.
170178
/// No valid records that fail this check should exist in the DB
171179
/// </summary>
172-
public bool IsValidBookingReference(string bookingReference)
180+
public static bool IsValidBookingReference(string bookingReference, ILogger logger)
173181
{
174182
//backwards compatibility with V1 bookings in flight
175183
if (BookingReferenceV1Regex.IsMatch(bookingReference))
@@ -199,11 +207,4 @@ public bool IsValidBookingReference(string bookingReference)
199207

200208
return true;
201209
}
202-
203-
internal static string FormatBookingReference(string raw)
204-
{
205-
return raw?.Length != 13
206-
? throw new ArgumentException("Must be 13 digits")
207-
: $"{raw[..4]}-{raw.Substring(4, 5)}-{raw.Substring(9, 4)}";
208-
}
209210
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
using Xunit;
2+
3+
namespace Nhs.Appointments.Api.Integration;
4+
5+
[CollectionDefinition("BookingReferenceV2SerialToggle")]
6+
public class BookingReferenceV2SerialToggleCollection : ICollectionFixture<object>
7+
{
8+
}

tests/Nhs.Appointments.Api.Integration/Scenarios/Booking/BookingBaseFeatureSteps.cs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@
1010
using Newtonsoft.Json;
1111
using Nhs.Appointments.Api.Models;
1212
using Nhs.Appointments.Core;
13+
using Nhs.Appointments.Core.ReferenceNumber.V2;
1314
using Nhs.Appointments.Persistance.Models;
15+
using Xunit;
1416
using Xunit.Gherkin.Quick;
1517
using AttendeeDetails = Nhs.Appointments.Core.AttendeeDetails;
1618
using ContactItem = Nhs.Appointments.Core.ContactItem;
1719

1820
namespace Nhs.Appointments.Api.Integration.Scenarios.Booking;
1921

20-
public abstract class BookingBaseFeatureSteps : AuditFeatureSteps
22+
public abstract class BookingBaseFeatureSteps(string flag, bool enabled) : AuditFeatureSteps, IAsyncLifetime
2123
{
2224
protected HttpResponseMessage Response { get; set; }
2325

@@ -129,8 +131,9 @@ public async Task Assert(DataTable dataTable)
129131
Id = bookingReference,
130132
AdditionalData = new { isAppBooking = cells.ElementAt(11).Value }
131133
};
132-
133-
result.BookingReference.Should().MatchRegex("([0-9]){2}-([0-9]{2})-([0-9]{6})");
134+
135+
ProviderHelper.IsValidBookingReference(result.BookingReference, null).Should().BeTrue();
136+
134137
var actualBooking = await Client.GetContainer("appts", "booking_data")
135138
.ReadItemAsync<BookingDocument>(bookingReference, new PartitionKey(siteId));
136139
BookingAssertions.BookingsAreEquivalent(actualBooking, expectedBooking);
@@ -200,4 +203,17 @@ protected string ToRequestFormat(string naturalLanguageDateOnly, string naturalL
200203
$"{ParseNaturalLanguageDateOnly(naturalLanguageDateOnly):yyyy-MM-dd} {naturalLanguageTime}",
201204
"yyyy-MM-dd HH:mm", null).ToString("yyyy-MM-dd HH:mm");
202205
}
206+
207+
private string Flag { get; } = flag;
208+
private bool Enabled { get; } = enabled;
209+
210+
public async Task InitializeAsync()
211+
{
212+
await SetLocalFeatureToggleOverride(Flag, Enabled ? "True" : "False");
213+
}
214+
215+
public async Task DisposeAsync()
216+
{
217+
await Task.CompletedTask;
218+
}
203219
}

tests/Nhs.Appointments.Api.Integration/Scenarios/Booking/Cancel/CancelBookingBaseFeatureSteps.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
namespace Nhs.Appointments.Api.Integration.Scenarios.Booking.Cancel;
1212

13-
public abstract class CancelBookingBaseFeatureSteps : BookingBaseFeatureSteps
13+
public abstract class CancelBookingBaseFeatureSteps(string flag, bool enabled) : BookingBaseFeatureSteps(flag, enabled)
1414
{
1515
private HttpResponseMessage _response;
1616
private HttpStatusCode _responseCode;
Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,26 @@
1-
using Xunit.Gherkin.Quick;
1+
using Nhs.Appointments.Core.Features;
2+
using Xunit;
3+
using Xunit.Gherkin.Quick;
24

35
namespace Nhs.Appointments.Api.Integration.Scenarios.Booking.Cancel;
46

7+
8+
[Collection("BookingReferenceV2SerialToggle")]
9+
[FeatureFile("./Scenarios/Booking/Cancel/Cancel.feature")]
10+
public class CancelBooking_BookingReferenceV2Enabled()
11+
: CancelBookingBaseFeatureSteps(Flags.BookingReferenceV2, true);
12+
13+
[Collection("BookingReferenceV2SerialToggle")]
514
[FeatureFile("./Scenarios/Booking/Cancel/Cancel.feature")]
6-
public class CancelBookingFeatureSteps : CancelBookingBaseFeatureSteps
7-
{
8-
}
15+
public class CancelBooking_BookingReferenceV2Disabled()
16+
: CancelBookingBaseFeatureSteps(Flags.BookingReferenceV2, false);
17+
18+
[Collection("BookingReferenceV2SerialToggle")]
19+
[FeatureFile("./Scenarios/Booking/Cancel/Autocancellation.feature")]
20+
public class AutoCancelBooking_BookingReferenceV2Enabled()
21+
: CancelBookingBaseFeatureSteps(Flags.BookingReferenceV2, true);
922

23+
[Collection("BookingReferenceV2SerialToggle")]
1024
[FeatureFile("./Scenarios/Booking/Cancel/Autocancellation.feature")]
11-
public class CancelBookingAutocancellationFeatureSteps : CancelBookingBaseFeatureSteps
12-
{
13-
}
25+
public class AutoCancelBooking_BookingReferenceV2Disabled()
26+
: CancelBookingBaseFeatureSteps(Flags.BookingReferenceV2, false);

tests/Nhs.Appointments.Api.Integration/Scenarios/Booking/Confirm/ConfirmBookingToggleCollections.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ namespace Nhs.Appointments.Api.Integration.Scenarios.Booking.Confirm;
66

77
[Collection("ConfirmBookingSerialToggle")]
88
[FeatureFile("./Scenarios/Booking/Confirm/ConfirmBooking_JointBookings_Enabled.feature")]
9-
public class ConfirmBooking_Enabled()
9+
public class ConfirmBooking_JointBookingsEnabled()
1010
: ConfirmBookingFeatureSteps(Flags.JointBookings, true);
1111

1212
[Collection("ConfirmBookingSerialToggle")]
1313
[FeatureFile("./Scenarios/Booking/Confirm/ConfirmBooking_JointBookings_Disabled.feature")]
14-
public class ConfirmBooking_Disabled()
14+
public class ConfirmBooking_JointBookingsDisabled()
1515
: ConfirmBookingFeatureSteps(Flags.JointBookings, false);
Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
1-
using Xunit.Gherkin.Quick;
1+
using Nhs.Appointments.Core.Features;
2+
using Xunit;
3+
using Xunit.Gherkin.Quick;
24

35
namespace Nhs.Appointments.Api.Integration.Scenarios.Booking
46
{
7+
[Collection("BookingReferenceV2SerialToggle")]
58
[FeatureFile("./Scenarios/Booking/MakeBooking.feature")]
6-
public class MakeBookingSingleServiceFeatureSteps : BookingBaseFeatureSteps;
9+
public class MakeBooking_BookingReferenceV2Enabled()
10+
: BookingBaseFeatureSteps(Flags.BookingReferenceV2, true);
11+
12+
[Collection("BookingReferenceV2SerialToggle")]
13+
[FeatureFile("./Scenarios/Booking/MakeBooking.feature")]
14+
public class MakeBooking_BookingReferenceV2Disabled()
15+
: BookingBaseFeatureSteps(Flags.BookingReferenceV2, false);
716
}

tests/Nhs.Appointments.Api.Integration/Scenarios/Booking/Query/QueryBookingsToggleCollections.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ namespace Nhs.Appointments.Api.Integration.Scenarios.Booking.Query;
66

77
[Collection("QueryBookingsSerialToggle")]
88
[FeatureFile("./Scenarios/Booking/Query/QueryBookings_CancelDay_Enabled.feature")]
9-
public class QueryBookings_Enabled()
9+
public class QueryBookings_CancelDayEnabled()
1010
: QueryBookingsFeatureSteps(Flags.CancelDay, true);
1111

1212
[Collection("QueryBookingsSerialToggle")]
1313
[FeatureFile("./Scenarios/Booking/Query/QueryBookings_CancelDay_Disabled.feature")]
14-
public class QueryBookings_Disabled()
14+
public class QueryBookings_CancelDayDisabled()
1515
: QueryBookingsFeatureSteps(Flags.CancelDay, false);

tests/Nhs.Appointments.Api.Integration/Scenarios/Booking/QueryBookingByNhsNumber.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88
using Gherkin.Ast;
99
using Nhs.Appointments.Api.Json;
1010
using Nhs.Appointments.Core;
11+
using Nhs.Appointments.Core.Features;
12+
using Xunit;
1113
using Xunit.Gherkin.Quick;
1214

1315
namespace Nhs.Appointments.Api.Integration.Scenarios.Booking
1416
{
15-
[FeatureFile("./Scenarios/Booking/QueryBookingByNhsNumber.feature")]
16-
public class QueryBookingByNhsNumber : BookingBaseFeatureSteps
17+
public abstract class QueryBookingByNhsNumberFeatureSteps(string flag, bool enabled) : BookingBaseFeatureSteps(flag, enabled)
1718
{
1819
private List<Core.Booking> _actualResponse;
1920
private HttpResponseMessage _response;
@@ -78,4 +79,15 @@ public void AssertNoAvailability()
7879
_actualResponse.Should().BeEmpty();
7980
}
8081
}
82+
83+
84+
[Collection("BookingReferenceV2SerialToggle")]
85+
[FeatureFile("./Scenarios/Booking/QueryBookingByNhsNumber.feature")]
86+
public class QueryBookingByNhsNumber_BookingReferenceV2Enabled()
87+
: QueryBookingByNhsNumberFeatureSteps(Flags.BookingReferenceV2, true);
88+
89+
[Collection("BookingReferenceV2SerialToggle")]
90+
[FeatureFile("./Scenarios/Booking/QueryBookingByNhsNumber.feature")]
91+
public class QueryBookingByNhsNumber_BookingReferenceV2Disabled()
92+
: QueryBookingByNhsNumberFeatureSteps(Flags.BookingReferenceV2, false);
8193
}

tests/Nhs.Appointments.Api.Integration/Scenarios/Booking/RescheduleFeatureSteps.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@
1212

1313
namespace Nhs.Appointments.Api.Integration.Scenarios.Booking
1414
{
15-
[FeatureFile("./Scenarios/Booking/Reschedule.feature")]
16-
public class RescheduleFeatureSteps : BookingBaseFeatureSteps
15+
public abstract class RescheduleFeatureSteps(string flag, bool enabled) : BookingBaseFeatureSteps(flag, enabled)
1716
{
1817
private string _reschduledBookingReference;
1918

@@ -51,4 +50,14 @@ public async Task AssertRescheduledBookingIsNotProvisional()
5150
actualBookingIndex.Resource.Status.Should().Be(AppointmentStatus.Booked);
5251
}
5352
}
53+
54+
[Collection("BookingReferenceV2SerialToggle")]
55+
[FeatureFile("./Scenarios/Booking/Reschedule.feature")]
56+
public class RescheduleBooking_BookingReferenceV2Enabled()
57+
: RescheduleFeatureSteps(Flags.BookingReferenceV2, true);
58+
59+
[Collection("BookingReferenceV2SerialToggle")]
60+
[FeatureFile("./Scenarios/Booking/Reschedule.feature")]
61+
public class RescheduleBooking_BookingReferenceV2Disabled()
62+
: RescheduleFeatureSteps(Flags.BookingReferenceV2, false);
5463
}

0 commit comments

Comments
 (0)