Skip to content

Commit f3a00b7

Browse files
Merge pull request #95 from TransactionProcessing/nightly/#94_buildfailure
Fixes for nightly build
2 parents 8537334 + 65fd3e6 commit f3a00b7

File tree

10 files changed

+380
-39
lines changed

10 files changed

+380
-39
lines changed

TransactionProcessorACL.IntegrationTests/Common/DockerHelper.cs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -172,12 +172,7 @@ public override async Task StartContainersForScenarioRun(String scenarioName)
172172
this.TestNetworks.Add(testNetwork);
173173
IContainerService eventStoreContainer = DockerHelper.SetupEventStoreContainer(this.EventStoreContainerName, this.Logger, "eventstore/eventstore:20.10.0-buster-slim", testNetwork, traceFolder);
174174
this.EventStoreHttpPort = eventStoreContainer.ToHostExposedEndpoint($"{DockerHelper.EventStoreHttpDockerPort}/tcp").Port;
175-
176-
await Retry.For(async () =>
177-
{
178-
await this.PopulateSubscriptionServiceConfiguration().ConfigureAwait(false);
179-
}, retryFor: TimeSpan.FromMinutes(2), retryInterval: TimeSpan.FromSeconds(30));
180-
175+
181176
IContainerService estateManagementContainer = DockerHelper.SetupEstateManagementContainer(this.EstateManagementContainerName, this.Logger,
182177
"stuartferguson/estatemanagement", new List<INetworkService>
183178
{
@@ -392,15 +387,15 @@ private async Task LoadEventStoreProjections()
392387
Logger.LogInformation("Loaded projections");
393388
}
394389

395-
protected async Task PopulateSubscriptionServiceConfiguration()
390+
public async Task PopulateSubscriptionServiceConfiguration(String estateName)
396391
{
397392
EventStorePersistentSubscriptionsClient client = new EventStorePersistentSubscriptionsClient(ConfigureEventStoreSettings(this.EventStoreHttpPort));
398393

399-
PersistentSubscriptionSettings settings = new PersistentSubscriptionSettings(resolveLinkTos: true);
400-
await client.CreateAsync("$ce-EstateAggregate", "Reporting", settings);
401-
await client.CreateAsync("$ce-MerchantAggregate", "Reporting", settings);
394+
PersistentSubscriptionSettings settings = new PersistentSubscriptionSettings(resolveLinkTos: true, StreamPosition.Start);
395+
await client.CreateAsync(estateName.Replace(" ", ""), "Reporting", settings);
396+
await client.CreateAsync($"EstateManagementSubscriptionStream_{estateName.Replace(" ", "")}", "Estate Management", settings);
402397
}
403-
398+
404399
private async Task RemoveEstateReadModel()
405400
{
406401
List<Guid> estateIdList = this.TestingContext.GetAllEstateIds();

TransactionProcessorACL.IntegrationTests/Shared/SharedSteps.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,12 @@ public async Task WhenICreateTheFollowingEstates(Table table)
572572

573573
EstateDetails estateDetails = this.TestingContext.GetEstateDetails(tableRow);
574574

575+
// Setup the subscriptions for the estate
576+
await Retry.For(async () =>
577+
{
578+
await this.TestingContext.DockerHelper.PopulateSubscriptionServiceConfiguration(estateName).ConfigureAwait(false);
579+
}, retryFor: TimeSpan.FromMinutes(2), retryInterval: TimeSpan.FromSeconds(30));
580+
575581
EstateResponse estate = null;
576582
await Retry.For(async () =>
577583
{
@@ -648,10 +654,14 @@ public async Task WhenICreateTheFollowingMerchants(Table table)
648654
token = estateDetails.AccessToken;
649655
}
650656

651-
MerchantResponse merchant = await this.TestingContext.DockerHelper.EstateClient
652-
.GetMerchant(token, estateDetails.EstateId, merchantId, CancellationToken.None).ConfigureAwait(false);
657+
await Retry.For(async () =>
658+
{
659+
MerchantResponse merchant = await this.TestingContext.DockerHelper.EstateClient
660+
.GetMerchant(token, estateDetails.EstateId, merchantId, CancellationToken.None)
661+
.ConfigureAwait(false);
653662

654-
merchant.MerchantName.ShouldBe(merchantName);
663+
merchant.MerchantName.ShouldBe(merchantName);
664+
});
655665
}
656666
}
657667

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
var fromStreams = fromStreams || require('../../node_modules/esprojection-testing-framework').scope.fromStreams;
2+
var emit = emit || require('../../node_modules/esprojection-testing-framework').scope.emit;
3+
4+
fromStreams("$ce-EstateAggregate", "$et-CallbackReceivedEvent")
5+
.when({
6+
$init: function (s, e) {
7+
return {
8+
estates: [],
9+
debug: []
10+
}
11+
},
12+
"EstateCreatedEvent": function (s, e) {
13+
s.estates.push({
14+
estateId: e.data.estateId,
15+
estateName: e.data.estateName
16+
});
17+
},
18+
"EstateReferenceAllocatedEvent": function (s, e) {
19+
var estateIndex = s.estates.findIndex(element => element.estateId === e.data.estateId);
20+
s.estates[estateIndex].reference = e.data.estateReference;
21+
},
22+
"CallbackReceivedEvent": function (s, e) {
23+
// find the estate from the reference
24+
if (s.debug === undefined) {
25+
s.debug = [];
26+
}
27+
var ref = e.data.reference.split("-"); // Element 0 is estate reference, Element 1 is merchant reference
28+
var estate = s.estates.find(element => element.reference === ref[0]);
29+
if (estate !== undefined && estate !== null) {
30+
var enrichedEvent = createEnrichedEvent(e, estate);
31+
32+
// Emit the enriched event
33+
emit(getStreamName(estate, e), "CallbackReceivedEnrichedEvent", enrichedEvent);
34+
}
35+
else {
36+
var enrichedEvent = createEnrichedEvent(e);
37+
// Emit the enriched event
38+
emit(getStreamName(estate, e), "CallbackReceivedEnrichedWithNoEstateEvent", enrichedEvent);
39+
}
40+
}
41+
});
42+
43+
function createEnrichedEvent(originalEvent, estate) {
44+
var enrichedEvent = {};
45+
if (estate !== undefined && estate !== null) {
46+
enrichedEvent = {
47+
typeString: originalEvent.data.typeString,
48+
messageFormat: originalEvent.data.messageFormat,
49+
callbackMessage: originalEvent.data.callbackMessage,
50+
estateId: estate.estateId,
51+
reference: originalEvent.data.reference
52+
};
53+
}
54+
else {
55+
enrichedEvent = {
56+
typeString: originalEvent.data.typeString,
57+
messageFormat: originalEvent.data.messageFormat,
58+
callbackMessage: originalEvent.data.callbackMessage,
59+
reference: originalEvent.data.reference
60+
};
61+
}
62+
63+
return enrichedEvent;
64+
}
65+
66+
function getStreamName(estate, e) {
67+
var streamName = "";
68+
if (e.data.destination === "EstateManagement") {
69+
streamName += "EstateManagementSubscriptionStream_";
70+
}
71+
72+
// Add the estate name
73+
if (estate !== undefined && estate !== null) {
74+
streamName += estate.estateName.replace(/ /g, "");
75+
}
76+
else {
77+
streamName += "UnknownEstate";
78+
}
79+
80+
return streamName;
81+
82+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
var fromAll = fromAll || require("../../node_modules/esprojection-testing-framework").scope.fromAll;
2+
var linkTo = linkTo || require("../../node_modules/esprojection-testing-framework").scope.linkTo;
3+
4+
isEstateEvent = (e) => { return (e.data && e.data.estateId); }
5+
isAnEstateCreatedEvent = (e) => { return compareEventTypeSafely(e.eventType, 'EstateCreatedEvent') };
6+
7+
isAMerchantFeeAddedToTransactionEvent = (e) => { return compareEventTypeSafely(e.eventType, 'MerchantFeeAddedToTransactionEvent') };
8+
isAServiceProviderFeeAddedToTransactionEvent = (e) => { return compareEventTypeSafely(e.eventType, 'ServiceProviderFeeAddedToTransactionEvent') };
9+
10+
compareEventTypeSafely = (sourceEventType, targetEventType) => { return (sourceEventType.toUpperCase() === targetEventType.toUpperCase()); }
11+
12+
ignoreEvent = (e) => isAServiceProviderFeeAddedToTransactionEvent(e) | isAMerchantFeeAddedToTransactionEvent(e);
13+
14+
isInvalidEvent = (e) => (e === null || e === undefined || e.data === undefined);
15+
16+
isTruncated = function (metadata) {
17+
if (metadata && metadata['$v']) {
18+
var parts = metadata['$v'].split(":");
19+
var projectionEpoch = parts[1];
20+
21+
return (projectionEpoch < 0);
22+
}
23+
return false;
24+
};
25+
26+
fromAll()
27+
.when({
28+
$init: function (s, e) {
29+
return { estates: {} }
30+
},
31+
$any: function (s, e) {
32+
if (isTruncated(e)) return;
33+
34+
if (isEstateEvent(e)) {
35+
if (ignoreEvent(e)) return;
36+
37+
if (isAnEstateCreatedEvent(e)) {
38+
s.estates[e.data.estateId] = {
39+
name: e.data.estateName.replace(/-/gi, "").replace(/ /g, "")
40+
};
41+
}
42+
43+
linkTo(s.estates[e.data.estateId].name, e);
44+
}
45+
}
46+
}
47+
);
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
var fromAll = fromAll || require("../../node_modules/esprojection-testing-framework").scope.fromAll;
2+
var linkTo = linkTo || require("../../node_modules/esprojection-testing-framework").scope.linkTo;
3+
4+
isEstateEvent = (e) => { return (e.data && e.data.estateId); }
5+
isAnEstateCreatedEvent = (e) => { return compareEventTypeSafely(e.eventType, 'EstateCreatedEvent') };
6+
compareEventTypeSafely = (sourceEventType, targetEventType) => { return (sourceEventType.toUpperCase() === targetEventType.toUpperCase()); }
7+
isInvalidEvent = (e) => (e === null || e === undefined || e.data === undefined);
8+
9+
getSupportedEventTypes = function () {
10+
var eventTypes = [];
11+
12+
eventTypes.push('ImportLogCreatedEvent');
13+
eventTypes.push('FileAddedToImportLogEvent');
14+
eventTypes.push('FileCreatedEvent');
15+
eventTypes.push('FileLineAddedEvent');
16+
eventTypes.push('FileLineProcessingSuccessfulEvent');
17+
eventTypes.push('FileLineProcessingIgnoredEvent');
18+
eventTypes.push('FileLineProcessingFailedEvent');
19+
eventTypes.push('FileProcessingCompletedEvent');
20+
21+
return eventTypes;
22+
}
23+
24+
isARequiredEvent = (e) => {
25+
var supportedEvents = getSupportedEventTypes();
26+
27+
var index = supportedEvents.indexOf(e.eventType);
28+
29+
return index !== -1
30+
};
31+
32+
isTruncated = function (metadata) {
33+
if (metadata && metadata['$v']) {
34+
var parts = metadata['$v'].split(":");
35+
var projectionEpoch = parts[1];
36+
37+
return (projectionEpoch < 0);
38+
}
39+
return false;
40+
};
41+
getStreamName = function (estateName) {
42+
return 'FileProcessorSubscriptionStream_' + estateName;
43+
}
44+
45+
fromAll()
46+
.when({
47+
$init: function (s, e) {
48+
return { estates: {} }
49+
},
50+
$any: function (s, e) {
51+
if (isTruncated(e)) return;
52+
53+
if (isEstateEvent(e)) {
54+
55+
if (isAnEstateCreatedEvent(e)) {
56+
s.estates[e.data.estateId] = {
57+
filteredName: e.data.estateName.replace(/-/gi, ""),
58+
name: e.data.estateName.replace(/-/gi, "").replace(" ", "")
59+
};
60+
}
61+
62+
if (isARequiredEvent(e) === false) return;
63+
64+
linkTo(getStreamName(s.estates[e.data.estateId].name), e);
65+
}
66+
}
67+
}
68+
);

TransactionProcessorACL.IntegrationTests/projections/continuous/MerchantAggregator.js

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
var fromAll = fromAll || require("../../node_modules/event-store-projection-testing").scope.fromAll;
2-
var linkTo = linkTo || require("../../node_modules/event-store-projection-testing").scope.linkTo;
1+
var fromAll = fromAll || require("../../node_modules/esprojection-testing-framework").scope.fromAll;
2+
var linkTo = linkTo || require("../../node_modules/esprojection-testing-framework").scope.linkTo;
33

44
isValidEvent = function (e) {
55

@@ -29,10 +29,8 @@ fromAll()
2929
if (isValidEvent(e)) {
3030
var merchantId = getMerchantId(e);
3131
if (merchantId !== null) {
32-
s.merchantId = merchantId;
3332
var streamName = "MerchantArchive-" + merchantId.replace(/-/gi, "");
34-
s.streamName = streamName;
35-
linkTo(streamName, e, e.metadata);
33+
linkTo(streamName, e);
3634
}
3735
}
3836
}

0 commit comments

Comments
 (0)