Skip to content
Open
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
3 changes: 2 additions & 1 deletion src/identity.interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,8 @@ export interface SDKIdentityApi {
): void;
createAliasRequest?(
sourceUser: IMParticleUser,
destinationUser: IMParticleUser
destinationUser: IMParticleUser,
scope?: string
): IAliasRequest;
}

Expand Down
6 changes: 4 additions & 2 deletions src/identity.js
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,8 @@ export default function Identity(mpInstance) {
source_mpid: aliasRequest.sourceMpid,
start_unixtime_ms: aliasRequest.startTime,
end_unixtime_ms: aliasRequest.endTime,
scope: aliasRequest.scope,
device_application_stamp: mpInstance._Store.deviceId,
scope: aliasRequest.scope || 'device',
},
};
},
Expand All @@ -195,6 +195,7 @@ export default function Identity(mpInstance) {
SourceMpid: aliasRequest.sourceMpid,
StartUnixtimeMs: aliasRequest.startTime,
EndUnixtimeMs: aliasRequest.endTime,
Scope: aliasRequest.scope || 'device',
};
},

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: 'scope',
Copy link

Copilot AI Jan 5, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The stub function should return 'device' as the default scope value to be consistent with the actual implementation. The value 'scope' appears to be a placeholder string rather than the intended default value.

Suggested change
scope: 'scope',
scope: 'device',

Copilot uses AI. Check for mistakes.
};
}

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
68 changes: 64 additions & 4 deletions test/src/tests-native-sdk.js
Original file line number Diff line number Diff line change
Expand Up @@ -649,7 +649,7 @@ 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;
const aliasRequest = {
destinationMpid: '101',
Expand All @@ -662,7 +662,32 @@ describe('native-sdk methods', function() {
callbackResult = callback;
});
mParticleAndroidV2Bridge.aliasUsers.should.equal(
'{"DestinationMpid":"101","SourceMpid":"202","StartUnixtimeMs":300,"EndUnixtimeMs":400}'
'{"DestinationMpid":"101","SourceMpid":"202","StartUnixtimeMs":300,"EndUnixtimeMs":400,"Scope":"device"}'
);

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,
scope: 'mpid',
};

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

callbackResult.httpCode.should.equal(
Expand Down Expand Up @@ -960,13 +985,48 @@ 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) {
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(
'{"DestinationMpid":"101","SourceMpid":"202","StartUnixtimeMs":300,"EndUnixtimeMs":400,"Scope":"device"}'
);
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 aliasRequest = {
destinationMpid: '101',
sourceMpid: '202',
startTime: 300,
endTime: 400,
scope: 'mpid',
};

mParticle.Identity.aliasUsers(aliasRequest, function(callback) {
Expand All @@ -982,7 +1042,7 @@ describe('native-sdk methods', function() {
JSON.stringify(
JSON.parse(mParticleIOSV2Bridge.data[0]).value
).should.equal(
'{"DestinationMpid":"101","SourceMpid":"202","StartUnixtimeMs":300,"EndUnixtimeMs":400}'
'{"DestinationMpid":"101","SourceMpid":"202","StartUnixtimeMs":300,"EndUnixtimeMs":400,"Scope":"mpid"}'
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems like we use this specific string in several places, and it's difficult to read. Maybe we extract this into an fixture earlier in the file that gets stringified?

);
mParticleIOSV2Bridge.reset();

Expand Down
Loading