Skip to content

Commit e9f69ca

Browse files
Merge pull request #49 from TransactionProcessing/task/#48_callbackhandlerprojection
Added new callback handler projection
2 parents 8ce75e2 + ca14e41 commit e9f69ca

4 files changed

Lines changed: 239 additions & 1 deletion

File tree

EventStoreProjections.Tests.njsproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535
<Content Include="app.js">
3636
<SubType>Code</SubType>
3737
</Content>
38+
<Content Include="src\continuous\CallbackHandlerEnricher.js">
39+
<SubType>Code</SubType>
40+
</Content>
3841
<Content Include="src\continuous\EstateAggregator.js" />
3942
<Content Include="src\continuous\FileProcessorSubscriptionStreamBuilder.js" />
4043
<Content Include="src\continuous\MerchantAggregator.js" />
@@ -43,6 +46,9 @@
4346
<Content Include="src\continuous\TransactionProcessorSubscriptionStreamBuilder.js">
4447
<SubType>Code</SubType>
4548
</Content>
49+
<Content Include="tests\CallbackHandlerEnricherTests.js">
50+
<SubType>Code</SubType>
51+
</Content>
4652
<Content Include="tests\EstateAggregatorTests.js" />
4753
<Content Include="tests\FileProcessorSubscriptionStreamBuilderTests.js">
4854
<SubType>Code</SubType>
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
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+
}
10+
},
11+
"EstateCreatedEvent": function (s, e) {
12+
s.estates.push({
13+
estateId: e.data.estateId,
14+
estateName: e.data.estateName
15+
});
16+
},
17+
"EstateReferenceAllocatedEvent": function (s, e)
18+
{
19+
var estate = s.estates.find(element => element.estateId === e.data.estateId);
20+
estate.reference = e.data.reference;
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+
{
31+
var enrichedEvent = createEnrichedEvent(e, estate);
32+
33+
// Emit the enriched event
34+
emit(getStreamName(estate, e), "CallbackReceivedEnrichedEvent", enrichedEvent);
35+
}
36+
else
37+
{
38+
var enrichedEvent = createEnrichedEvent(e);
39+
// Emit the enriched event
40+
emit(getStreamName(estate, e), "CallbackReceivedEnrichedWithNoEstateEvent", enrichedEvent);
41+
}
42+
}
43+
});
44+
45+
function createEnrichedEvent(originalEvent, estate)
46+
{
47+
var enrichedEvent = {};
48+
if (estate !== undefined && estate !== null)
49+
{
50+
enrichedEvent = {
51+
typeString: originalEvent.data.typeString,
52+
messageFormat: originalEvent.data.messageFormat,
53+
callbackMessage: originalEvent.data.callbackMessage,
54+
estateId: estate.estateId,
55+
reference: originalEvent.data.reference
56+
};
57+
}
58+
else
59+
{
60+
enrichedEvent = {
61+
typeString: originalEvent.data.typeString,
62+
messageFormat: originalEvent.data.messageFormat,
63+
callbackMessage: originalEvent.data.callbackMessage,
64+
reference: originalEvent.data.reference
65+
};
66+
}
67+
68+
return enrichedEvent;
69+
}
70+
71+
function getStreamName(estate, e) {
72+
var streamName = "";
73+
if (e.data.destination === "EstateManagement") {
74+
streamName += "EstateManagementSubscriptionStream_";
75+
}
76+
77+
// Add the estate name
78+
if (estate !== undefined && estate !== null)
79+
{
80+
streamName += estate.estateName.replace(" ", "");
81+
}
82+
else
83+
{
84+
streamName += "UnknownEstate";
85+
}
86+
87+
return streamName;
88+
89+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
var chai = require('chai');
2+
require('../src/continuous/CallbackHandlerEnricher.js');
3+
var projection = require('esprojection-testing-framework');
4+
var testData = require('./TestData.js');
5+
6+
describe('Callback Handler Enricher Tests', function()
7+
{
8+
beforeEach(function() { projection.initialize(); });
9+
10+
it('Projection Can Handle Estate Events',
11+
function()
12+
{
13+
var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc';
14+
var estateName = 'Demo Estate';
15+
var reference = "1";
16+
17+
var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName);
18+
19+
projection.processEvent(
20+
'EstateAggregate-' + estateId.replace(/-/gi, ""),
21+
estateCreatedEvent.eventType,
22+
estateCreatedEvent.data);
23+
24+
var estateReferenceAllocatedEvent = testData.getEstateReferenceAllocatedEvent(estateId, reference);
25+
projection.processEvent(
26+
'EstateAggregate-' + estateId.replace(/-/gi, ""),
27+
estateReferenceAllocatedEvent.eventType,
28+
estateReferenceAllocatedEvent.data);
29+
30+
var projectionState = projection.getState();
31+
32+
chai.expect(projectionState).to.not.be.null;
33+
chai.expect(projectionState.estates).to.not.be.null;
34+
chai.expect(projectionState.estates.length).to.equal(1);
35+
chai.expect(projectionState.estates[0].estateId).to.equal(estateId);
36+
chai.expect(projectionState.estates[0].reference).to.equal(reference);
37+
}
38+
);
39+
40+
it('Projection Can Handle Callback Received Event after Estate Created',
41+
function () {
42+
var estateId = '3bf2dab2-86d6-44e3-bcf8-51bec65cf8bc';
43+
var estateName = 'Demo Estate';
44+
var reference = "1";
45+
46+
var estateCreatedEvent = testData.getEstateCreatedEvent(estateId, estateName);
47+
48+
projection.processEvent(
49+
'EstateAggregate-' + estateId.replace(/-/gi, ""),
50+
estateCreatedEvent.eventType,
51+
estateCreatedEvent.data);
52+
53+
var estateReferenceAllocatedEvent = testData.getEstateReferenceAllocatedEvent(estateId, reference);
54+
projection.processEvent(
55+
'EstateAggregate-' + estateId.replace(/-/gi, ""),
56+
estateReferenceAllocatedEvent.eventType,
57+
estateReferenceAllocatedEvent.data);
58+
59+
var projectionState = projection.getState();
60+
61+
chai.expect(projectionState).to.not.be.null;
62+
chai.expect(projectionState.estates).to.not.be.null;
63+
chai.expect(projectionState.estates.length).to.equal(1);
64+
65+
var destination = "EstateManagement";
66+
var estateReference = "1";
67+
var merchantReference = "1";
68+
var callbackReceivedEvent = testData.getCallbackReceivedEvent(destination, estateReference, merchantReference);
69+
70+
projection.processEvent(
71+
"$et-CallbackReceivedEvent",
72+
callbackReceivedEvent.eventType,
73+
callbackReceivedEvent.data);
74+
75+
var events = projection.emittedEvents;
76+
chai.expect(events.length).to.equal(1);
77+
78+
var eventBody = JSON.parse(events[0].body);
79+
chai.expect(eventBody.estateId).to.equal(estateId);
80+
chai.expect(events[0].streamId).to.equal(destination + "SubscriptionStream_" + estateName.replace(" ", ""));
81+
chai.expect(events[0].eventName).to.equal("CallbackReceivedEnrichedEvent");
82+
}
83+
);
84+
85+
it('Projection Can Handle Callback Received Event before Estate Created',
86+
function () {
87+
88+
var destination = "EstateManagement";
89+
var estateReference = "1";
90+
var merchantReference = "1";
91+
var callbackReceivedEvent = testData.getCallbackReceivedEvent(destination, estateReference, merchantReference);
92+
93+
projection.processEvent(
94+
"$et-CallbackReceivedEvent",
95+
callbackReceivedEvent.eventType,
96+
callbackReceivedEvent.data);
97+
98+
var events = projection.emittedEvents;
99+
chai.expect(events.length).to.equal(1);
100+
101+
var eventBody = JSON.parse(events[0].body);
102+
chai.expect(eventBody.estateId).to.be.undefined;
103+
chai.expect(events[0].streamId).to.equal(destination + "SubscriptionStream_UnknownEstate");
104+
chai.expect(events[0].eventName).to.equal("CallbackReceivedEnrichedWithNoEstateEvent");
105+
}
106+
);
107+
});

tests/TestData.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,22 @@ module.exports = {
1616
};
1717
},
1818

19+
getEstateReferenceAllocatedEvent: function (estateId, reference)
20+
{
21+
return {
22+
eventType: 'EstateReferenceAllocatedEvent',
23+
24+
data: {
25+
"estateId": estateId,
26+
"reference": reference
27+
},
28+
metadata: {
29+
30+
},
31+
eventId: "5B9D9F40-8BF5-4B2A-B5FA-6A02701B9AEC"
32+
};
33+
},
34+
1935
getSecurityUserAddedToEstateEvent: function (estateId, securityUserId, emailAddress) {
2036
return {
2137
eventType: 'SecurityUserAddedToEstateEvent',
@@ -615,8 +631,28 @@ module.exports = {
615631
},
616632
eventId: "6CCD33B7-07D5-4545-AD84-E0752743A5D2"
617633
}
618-
}
634+
},
619635

636+
getCallbackReceivedEvent: function (destination, estateReference, merchantReference)
637+
{
638+
var reference = estateReference + "-" + merchantReference;
639+
console.log(reference);
640+
return {
641+
eventType: 'CallbackReceivedEvent',
620642

643+
data: {
644+
"typeString": "CallbackHandler.Controllers.Deposit",
645+
"messageFormat": 1,
646+
"callbackMessage":
647+
"{\"account_number\":\"12345678\",\"amount\":100.00,\"date_time\":\"2021-10-18T06:48:00Z\",\"deposit_id\":\"5cbbcbdd-3d21-4078-b08b-3dcf607253d9\",\"host_identifier\":\"5cbbcbdd-3d21-4078-b08b-3dcf607253d9\",\"reference\":\"1-1\",\"sort_code\":\"123456\"}",
648+
"destination": destination,
649+
"reference": reference
650+
},
651+
metadata: {
652+
653+
},
654+
eventId: "AD762308-D055-4A2F-A4AC-44CC6B0DDA40"
655+
};
656+
},
621657

622658
};

0 commit comments

Comments
 (0)