Skip to content

Commit b3c937a

Browse files
authored
feat: Support scope in alias requests (#1138)
1 parent 015d212 commit b3c937a

7 files changed

Lines changed: 167 additions & 24 deletions

File tree

src/identity.interfaces.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,14 @@ export interface IIdentityRequest {
107107
): IdentityPreProcessResult;
108108
}
109109

110+
export type AliasRequestScope = 'device' | 'mpid';
111+
110112
export interface IAliasRequest {
111113
destinationMpid: MPID;
112114
sourceMpid: MPID;
113115
startTime: number;
114116
endTime: number;
115-
scope?: string;
117+
scope?: AliasRequestScope;
116118
}
117119

118120
export interface IAliasCallback {
@@ -151,7 +153,8 @@ export interface SDKIdentityApi {
151153
): void;
152154
createAliasRequest?(
153155
sourceUser: IMParticleUser,
154-
destinationUser: IMParticleUser
156+
destinationUser: IMParticleUser,
157+
scope?: AliasRequestScope
155158
): IAliasRequest;
156159
}
157160

src/identity.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ export default function Identity(mpInstance) {
195195
SourceMpid: aliasRequest.sourceMpid,
196196
StartUnixtimeMs: aliasRequest.startTime,
197197
EndUnixtimeMs: aliasRequest.endTime,
198+
Scope: aliasRequest.scope,
198199
};
199200
},
200201

@@ -744,7 +745,7 @@ export default function Identity(mpInstance) {
744745
after applying this adjustment it will be impossible to create an aliasRequest passes the aliasUsers()
745746
validation that the startTime must be less than the endTime
746747
*/
747-
createAliasRequest: function(sourceUser, destinationUser) {
748+
createAliasRequest: function(sourceUser, destinationUser, scope) {
748749
try {
749750
if (!destinationUser || !sourceUser) {
750751
mpInstance.Logger.error(
@@ -788,6 +789,7 @@ export default function Identity(mpInstance) {
788789
sourceMpid: sourceUser.getMPID(),
789790
startTime: startTime,
790791
endTime: endTime,
792+
scope: scope || 'device',
791793
};
792794
} catch (e) {
793795
mpInstance.Logger.error(

src/mparticle-instance-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,10 +368,10 @@ function mParticleInstanceManager(this: IMParticleInstanceManager) {
368368
aliasUsers: function(aliasRequest, callback) {
369369
self.getInstance().Identity.aliasUsers(aliasRequest, callback);
370370
},
371-
createAliasRequest: function(sourceUser, destinationUser) {
371+
createAliasRequest: function(sourceUser, destinationUser, scope) {
372372
return self
373373
.getInstance()
374-
.Identity.createAliasRequest(sourceUser, destinationUser);
374+
.Identity.createAliasRequest(sourceUser, destinationUser, scope);
375375
},
376376
getCurrentUser: function() {
377377
return self.getInstance().Identity.getCurrentUser();

src/stub/mparticle.stub.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ function createAliasRequest() {
166166
destinationMpid: 'b',
167167
startTime: new Date().getTime(),
168168
endTime: new Date().getTime(),
169+
scope: 'device',
169170
};
170171
}
171172

test/jest/identity.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ describe('Identity', () => {
209209
sourceMpid: '456',
210210
startTime: Date.now(),
211211
endTime: Date.now() + 1000,
212-
scope: 'test-scope',
212+
scope: 'mpid',
213213
};
214214

215215
expect(testAliasRequest).toBeDefined();

test/src/tests-identity.ts

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3887,6 +3887,79 @@ describe('identity', function() {
38873887
clock.restore();
38883888
});
38893889

3890+
it('should include scope in createAliasRequest when provided', async () => {
3891+
const cookies = JSON.stringify({
3892+
gs: {
3893+
sid: 'fst Test',
3894+
les: new Date().getTime(),
3895+
},
3896+
1: {
3897+
fst: 200,
3898+
lst: 400,
3899+
},
3900+
cu: '2',
3901+
});
3902+
3903+
setCookie(workspaceCookieName, cookies);
3904+
3905+
mParticle.init(apiKey, window.mParticle.config);
3906+
await waitForCondition(hasIdentityCallInflightReturned);
3907+
3908+
// Mock clock so we can use simple integers for time
3909+
clock = sinon.useFakeTimers();
3910+
clock.tick(1000);
3911+
3912+
const destinationUser = mParticle.Identity.getCurrentUser();
3913+
const sourceUser = mParticle.Identity.getUser('1');
3914+
3915+
const aliasRequest = mParticle.Identity.createAliasRequest(
3916+
sourceUser,
3917+
destinationUser,
3918+
'mpid'
3919+
);
3920+
expect(aliasRequest.sourceMpid).to.equal('1');
3921+
expect(aliasRequest.destinationMpid).to.equal('2');
3922+
expect(aliasRequest.startTime).to.equal(200);
3923+
expect(aliasRequest.endTime).to.equal(400);
3924+
expect(aliasRequest.scope).to.equal('mpid');
3925+
clock.restore();
3926+
});
3927+
3928+
it('should default scope to device in createAliasRequest when not provided', async () => {
3929+
const cookies = JSON.stringify({
3930+
gs: {
3931+
sid: 'fst Test',
3932+
les: new Date().getTime(),
3933+
},
3934+
1: {
3935+
fst: 200,
3936+
lst: 400,
3937+
},
3938+
cu: '2',
3939+
});
3940+
3941+
setCookie(workspaceCookieName, cookies);
3942+
3943+
mParticle.init(apiKey, window.mParticle.config);
3944+
await waitForCondition(hasIdentityCallInflightReturned);
3945+
3946+
// Mock clock so we can use simple integers for time
3947+
clock = sinon.useFakeTimers();
3948+
clock.tick(1000);
3949+
3950+
const destinationUser = mParticle.Identity.getCurrentUser();
3951+
const sourceUser = mParticle.Identity.getUser('1');
3952+
3953+
const aliasRequest = mParticle.Identity.createAliasRequest(
3954+
sourceUser,
3955+
destinationUser
3956+
);
3957+
expect(aliasRequest.sourceMpid).to.equal('1');
3958+
expect(aliasRequest.destinationMpid).to.equal('2');
3959+
expect(aliasRequest.scope).to.equal('device');
3960+
clock.restore();
3961+
});
3962+
38903963
it("alias request should have environment 'development' when isDevelopmentMode is true", async () => {
38913964
window.mParticle.config.isDevelopmentMode = true;
38923965

test/src/tests-native-sdk.js

Lines changed: 82 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,32 @@ const getLocalStorage = Utils.getLocalStorage,
77
mParticleAndroid = Utils.mParticleAndroid,
88
HTTPCodes = Constants.HTTPCodes;
99

10+
// Alias request test fixtures
11+
const aliasRequestFixture = {
12+
destinationMpid: '101',
13+
sourceMpid: '202',
14+
startTime: 300,
15+
endTime: 400,
16+
scope: 'device',
17+
};
18+
19+
const expectedAliasPayload = {
20+
DestinationMpid: '101',
21+
SourceMpid: '202',
22+
StartUnixtimeMs: 300,
23+
EndUnixtimeMs: 400,
24+
};
25+
26+
const expectedAliasPayloadWithDeviceScope = JSON.stringify({
27+
...expectedAliasPayload,
28+
Scope: 'device',
29+
});
30+
31+
const expectedAliasPayloadWithMpidScope = JSON.stringify({
32+
...expectedAliasPayload,
33+
Scope: 'mpid',
34+
});
35+
1036
describe('native-sdk methods', function() {
1137
beforeEach(function() {
1238
mParticle._resetForTests(MPConfig);
@@ -649,20 +675,36 @@ describe('native-sdk methods', function() {
649675
mParticleAndroidV2Bridge.modifyData.should.equal(JSONData);
650676
});
651677

652-
it('should send a JSON object to the Android\'s Alias method', () => {
678+
it("should send a JSON object to the Android's Alias method", () => {
679+
let callbackResult;
680+
681+
mParticle.Identity.aliasUsers(aliasRequestFixture, function(callback) {
682+
callbackResult = callback;
683+
});
684+
mParticleAndroidV2Bridge.aliasUsers.should.equal(
685+
expectedAliasPayloadWithDeviceScope
686+
);
687+
688+
callbackResult.httpCode.should.equal(
689+
HTTPCodes.nativeIdentityRequest
690+
);
691+
callbackResult.message.should.equal(
692+
'Alias request sent to native sdk'
693+
);
694+
});
695+
696+
it("should send a JSON object with scope to the Android's Alias method when scope is provided", () => {
653697
let callbackResult;
654-
const aliasRequest = {
655-
destinationMpid: '101',
656-
sourceMpid: '202',
657-
startTime: 300,
658-
endTime: 400,
698+
const aliasRequestWithMPIDScope = {
699+
...aliasRequestFixture,
700+
scope: 'mpid',
659701
};
660702

661-
mParticle.Identity.aliasUsers(aliasRequest, function(callback) {
703+
mParticle.Identity.aliasUsers(aliasRequestWithMPIDScope, function(callback) {
662704
callbackResult = callback;
663705
});
664706
mParticleAndroidV2Bridge.aliasUsers.should.equal(
665-
'{"DestinationMpid":"101","SourceMpid":"202","StartUnixtimeMs":300,"EndUnixtimeMs":400}'
707+
expectedAliasPayloadWithMpidScope
666708
);
667709

668710
callbackResult.httpCode.should.equal(
@@ -960,16 +1002,10 @@ describe('native-sdk methods', function() {
9601002
mParticleIOSV2Bridge.reset();
9611003
});
9621004

963-
it('should send a JSON object to the iOS SDK\'s Alias method', () => {
1005+
it("should send a JSON object to the iOS SDK's Alias method", () => {
9641006
let callbackResult;
965-
const aliasRequest = {
966-
destinationMpid: '101',
967-
sourceMpid: '202',
968-
startTime: 300,
969-
endTime: 400,
970-
};
9711007

972-
mParticle.Identity.aliasUsers(aliasRequest, function(callback) {
1008+
mParticle.Identity.aliasUsers(aliasRequestFixture, function(callback) {
9731009
callbackResult = callback;
9741010
});
9751011

@@ -981,9 +1017,37 @@ describe('native-sdk methods', function() {
9811017
);
9821018
JSON.stringify(
9831019
JSON.parse(mParticleIOSV2Bridge.data[0]).value
984-
).should.equal(
985-
'{"DestinationMpid":"101","SourceMpid":"202","StartUnixtimeMs":300,"EndUnixtimeMs":400}'
1020+
).should.equal(expectedAliasPayloadWithDeviceScope);
1021+
mParticleIOSV2Bridge.reset();
1022+
1023+
callbackResult.httpCode.should.equal(
1024+
HTTPCodes.nativeIdentityRequest
1025+
);
1026+
callbackResult.message.should.equal(
1027+
'Alias request sent to native sdk'
1028+
);
1029+
});
1030+
1031+
it("should send a JSON object with scope to the iOS SDK's Alias method when scope is provided", () => {
1032+
let callbackResult;
1033+
const aliasRequestWithMPIDScope = {
1034+
...aliasRequestFixture,
1035+
scope: 'mpid',
1036+
};
1037+
1038+
mParticle.Identity.aliasUsers(aliasRequestWithMPIDScope, function(callback) {
1039+
callbackResult = callback;
1040+
});
1041+
1042+
JSON.parse(mParticleIOSV2Bridge.data[0]).should.have.properties(
1043+
['path', 'value']
9861044
);
1045+
JSON.parse(mParticleIOSV2Bridge.data[0]).path.should.equal(
1046+
'aliasUsers'
1047+
);
1048+
JSON.stringify(
1049+
JSON.parse(mParticleIOSV2Bridge.data[0]).value
1050+
).should.equal(expectedAliasPayloadWithMpidScope);
9871051
mParticleIOSV2Bridge.reset();
9881052

9891053
callbackResult.httpCode.should.equal(

0 commit comments

Comments
 (0)