Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions src/identity.interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,14 @@ export interface IIdentityRequest {
): IdentityPreProcessResult;
}

export type AliasRequestScope = 'device' | 'mpid';

export interface IAliasRequest {
destinationMpid: MPID;
sourceMpid: MPID;
startTime: number;
endTime: number;
scope?: string;
scope?: AliasRequestScope;
}

export interface IAliasCallback {
Expand Down Expand Up @@ -151,7 +153,8 @@ export interface SDKIdentityApi {
): void;
createAliasRequest?(
sourceUser: IMParticleUser,
destinationUser: IMParticleUser
destinationUser: IMParticleUser,
scope?: AliasRequestScope
): IAliasRequest;
}

Expand Down
4 changes: 3 additions & 1 deletion src/identity.js
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ export default function Identity(mpInstance) {
SourceMpid: aliasRequest.sourceMpid,
StartUnixtimeMs: aliasRequest.startTime,
EndUnixtimeMs: aliasRequest.endTime,
Scope: aliasRequest.scope,
};
},

Expand Down Expand Up @@ -744,7 +745,7 @@ export default function Identity(mpInstance) {
after applying this adjustment it will be impossible to create an aliasRequest passes the aliasUsers()
validation that the startTime must be less than the endTime
*/
createAliasRequest: function(sourceUser, destinationUser) {
createAliasRequest: function(sourceUser, destinationUser, scope) {
try {
if (!destinationUser || !sourceUser) {
mpInstance.Logger.error(
Expand Down Expand Up @@ -788,6 +789,7 @@ export default function Identity(mpInstance) {
sourceMpid: sourceUser.getMPID(),
startTime: startTime,
endTime: endTime,
scope: scope || 'device',
};
} catch (e) {
mpInstance.Logger.error(
Expand Down
4 changes: 2 additions & 2 deletions src/mparticle-instance-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -368,10 +368,10 @@ function mParticleInstanceManager(this: IMParticleInstanceManager) {
aliasUsers: function(aliasRequest, callback) {
self.getInstance().Identity.aliasUsers(aliasRequest, callback);
},
createAliasRequest: function(sourceUser, destinationUser) {
createAliasRequest: function(sourceUser, destinationUser, scope) {
return self
.getInstance()
.Identity.createAliasRequest(sourceUser, destinationUser);
.Identity.createAliasRequest(sourceUser, destinationUser, scope);
},
getCurrentUser: function() {
return self.getInstance().Identity.getCurrentUser();
Expand Down
1 change: 1 addition & 0 deletions src/stub/mparticle.stub.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ function createAliasRequest() {
destinationMpid: 'b',
startTime: new Date().getTime(),
endTime: new Date().getTime(),
scope: 'device',
};
}

Expand Down
2 changes: 1 addition & 1 deletion test/jest/identity.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ describe('Identity', () => {
sourceMpid: '456',
startTime: Date.now(),
endTime: Date.now() + 1000,
scope: 'test-scope',
scope: 'mpid',
};

expect(testAliasRequest).toBeDefined();
Expand Down
73 changes: 73 additions & 0 deletions test/src/tests-identity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3887,6 +3887,79 @@ describe('identity', function() {
clock.restore();
});

it('should include scope in createAliasRequest when provided', async () => {
const cookies = JSON.stringify({
gs: {
sid: 'fst Test',
les: new Date().getTime(),
},
1: {
fst: 200,
lst: 400,
},
cu: '2',
});

setCookie(workspaceCookieName, cookies);

mParticle.init(apiKey, window.mParticle.config);
await waitForCondition(hasIdentityCallInflightReturned);

// Mock clock so we can use simple integers for time
clock = sinon.useFakeTimers();
clock.tick(1000);

const destinationUser = mParticle.Identity.getCurrentUser();
const sourceUser = mParticle.Identity.getUser('1');

const aliasRequest = mParticle.Identity.createAliasRequest(
sourceUser,
destinationUser,
'mpid'
);
expect(aliasRequest.sourceMpid).to.equal('1');
expect(aliasRequest.destinationMpid).to.equal('2');
expect(aliasRequest.startTime).to.equal(200);
expect(aliasRequest.endTime).to.equal(400);
expect(aliasRequest.scope).to.equal('mpid');
clock.restore();
});

it('should default scope to device in createAliasRequest when not provided', async () => {
const cookies = JSON.stringify({
gs: {
sid: 'fst Test',
les: new Date().getTime(),
},
1: {
fst: 200,
lst: 400,
},
cu: '2',
});

setCookie(workspaceCookieName, cookies);

mParticle.init(apiKey, window.mParticle.config);
await waitForCondition(hasIdentityCallInflightReturned);

// Mock clock so we can use simple integers for time
clock = sinon.useFakeTimers();
clock.tick(1000);

const destinationUser = mParticle.Identity.getCurrentUser();
const sourceUser = mParticle.Identity.getUser('1');

const aliasRequest = mParticle.Identity.createAliasRequest(
sourceUser,
destinationUser
);
expect(aliasRequest.sourceMpid).to.equal('1');
expect(aliasRequest.destinationMpid).to.equal('2');
expect(aliasRequest.scope).to.equal('device');
clock.restore();
});

it("alias request should have environment 'development' when isDevelopmentMode is true", async () => {
window.mParticle.config.isDevelopmentMode = true;

Expand Down
100 changes: 82 additions & 18 deletions test/src/tests-native-sdk.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,32 @@ const getLocalStorage = Utils.getLocalStorage,
mParticleAndroid = Utils.mParticleAndroid,
HTTPCodes = Constants.HTTPCodes;

// Alias request test fixtures
const aliasRequestFixture = {
destinationMpid: '101',
sourceMpid: '202',
startTime: 300,
endTime: 400,
scope: 'device',
};

const expectedAliasPayload = {
DestinationMpid: '101',
SourceMpid: '202',
StartUnixtimeMs: 300,
EndUnixtimeMs: 400,
};

const expectedAliasPayloadWithDeviceScope = JSON.stringify({
...expectedAliasPayload,
Scope: 'device',
});

const expectedAliasPayloadWithMpidScope = JSON.stringify({
...expectedAliasPayload,
Scope: 'mpid',
});

describe('native-sdk methods', function() {
beforeEach(function() {
mParticle._resetForTests(MPConfig);
Expand Down Expand Up @@ -649,20 +675,36 @@ describe('native-sdk methods', function() {
mParticleAndroidV2Bridge.modifyData.should.equal(JSONData);
});

it('should send a JSON object to the Android\'s Alias method', () => {
it("should send a JSON object to the Android's Alias method", () => {
let callbackResult;

mParticle.Identity.aliasUsers(aliasRequestFixture, function(callback) {
callbackResult = callback;
});
mParticleAndroidV2Bridge.aliasUsers.should.equal(
expectedAliasPayloadWithDeviceScope
);

callbackResult.httpCode.should.equal(
HTTPCodes.nativeIdentityRequest
);
callbackResult.message.should.equal(
'Alias request sent to native sdk'
);
});

it("should send a JSON object with scope to the Android's Alias method when scope is provided", () => {
let callbackResult;
const aliasRequest = {
destinationMpid: '101',
sourceMpid: '202',
startTime: 300,
endTime: 400,
const aliasRequestWithMPIDScope = {
...aliasRequestFixture,
scope: 'mpid',
};

mParticle.Identity.aliasUsers(aliasRequest, function(callback) {
mParticle.Identity.aliasUsers(aliasRequestWithMPIDScope, function(callback) {
callbackResult = callback;
});
mParticleAndroidV2Bridge.aliasUsers.should.equal(
'{"DestinationMpid":"101","SourceMpid":"202","StartUnixtimeMs":300,"EndUnixtimeMs":400}'
expectedAliasPayloadWithMpidScope
);

callbackResult.httpCode.should.equal(
Expand Down Expand Up @@ -960,16 +1002,10 @@ describe('native-sdk methods', function() {
mParticleIOSV2Bridge.reset();
});

it('should send a JSON object to the iOS SDK\'s Alias method', () => {
it("should send a JSON object to the iOS SDK's Alias method", () => {
let callbackResult;
const aliasRequest = {
destinationMpid: '101',
sourceMpid: '202',
startTime: 300,
endTime: 400,
};

mParticle.Identity.aliasUsers(aliasRequest, function(callback) {
mParticle.Identity.aliasUsers(aliasRequestFixture, function(callback) {
callbackResult = callback;
});

Expand All @@ -981,9 +1017,37 @@ describe('native-sdk methods', function() {
);
JSON.stringify(
JSON.parse(mParticleIOSV2Bridge.data[0]).value
).should.equal(
'{"DestinationMpid":"101","SourceMpid":"202","StartUnixtimeMs":300,"EndUnixtimeMs":400}'
).should.equal(expectedAliasPayloadWithDeviceScope);
mParticleIOSV2Bridge.reset();

callbackResult.httpCode.should.equal(
HTTPCodes.nativeIdentityRequest
);
callbackResult.message.should.equal(
'Alias request sent to native sdk'
);
});

it("should send a JSON object with scope to the iOS SDK's Alias method when scope is provided", () => {
let callbackResult;
const aliasRequestWithMPIDScope = {
...aliasRequestFixture,
scope: 'mpid',
};

mParticle.Identity.aliasUsers(aliasRequestWithMPIDScope, function(callback) {
callbackResult = callback;
});

JSON.parse(mParticleIOSV2Bridge.data[0]).should.have.properties(
['path', 'value']
);
JSON.parse(mParticleIOSV2Bridge.data[0]).path.should.equal(
'aliasUsers'
);
JSON.stringify(
JSON.parse(mParticleIOSV2Bridge.data[0]).value
).should.equal(expectedAliasPayloadWithMpidScope);
mParticleIOSV2Bridge.reset();

callbackResult.httpCode.should.equal(
Expand Down
Loading