Skip to content

Commit d4eb736

Browse files
authored
Support _linkWith if no provider (#810)
1 parent df81cba commit d4eb736

File tree

4 files changed

+94
-2
lines changed

4 files changed

+94
-2
lines changed

integration/server.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@ const api = new ParseServer({
2121
},
2222
facebook: {
2323
appIds: "test"
24-
}
24+
},
25+
twitter: {
26+
consumer_key: "5QiVwxr8FQHbo5CMw46Z0jquF",
27+
consumer_secret: "p05FDlIRAnOtqJtjIt0xcw390jCcjj56QMdE9B52iVgOEb7LuK",
28+
},
2529
},
2630
verbose: false,
2731
silent: true,

integration/test/ParseUserTest.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,4 +720,52 @@ describe('Parse User', () => {
720720
expect(Parse.FacebookUtils.isLinked(user)).toBe(false);
721721
expect(Parse.AnonymousUtils.isLinked(user)).toBe(true);
722722
});
723+
724+
it('can link with twitter', async () => {
725+
Parse.User.enableUnsafeCurrentUser();
726+
const authData = {
727+
id: 227463280,
728+
consumer_key: "5QiVwxr8FQHbo5CMw46Z0jquF",
729+
consumer_secret: "p05FDlIRAnOtqJtjIt0xcw390jCcjj56QMdE9B52iVgOEb7LuK",
730+
auth_token: "227463280-k3XC8S5QzfQlOfEdGN8aHWvhWAUpGoLwzsjYQMnt",
731+
auth_token_secret: "uLlXKP6djaP9Fc2IdMcp9QqmsouXvDqcYVdUkWdu6pQpM"
732+
};
733+
const user = new Parse.User();
734+
user.setUsername('Alice');
735+
user.setPassword('sekrit');
736+
await user.signUp();
737+
738+
await user._linkWith('twitter', { authData });
739+
740+
expect(user.get('authData').twitter.id).toBe(authData.id);
741+
expect(user._isLinked('twitter')).toBe(true);
742+
743+
await user._unlinkFrom('twitter');
744+
expect(user._isLinked('twitter')).toBe(false);
745+
});
746+
747+
it('can link with twitter and facebook', async () => {
748+
Parse.User.enableUnsafeCurrentUser();
749+
Parse.FacebookUtils.init();
750+
const authData = {
751+
id: 227463280,
752+
consumer_key: "5QiVwxr8FQHbo5CMw46Z0jquF",
753+
consumer_secret: "p05FDlIRAnOtqJtjIt0xcw390jCcjj56QMdE9B52iVgOEb7LuK",
754+
auth_token: "227463280-k3XC8S5QzfQlOfEdGN8aHWvhWAUpGoLwzsjYQMnt",
755+
auth_token_secret: "uLlXKP6djaP9Fc2IdMcp9QqmsouXvDqcYVdUkWdu6pQpM"
756+
};
757+
const user = new Parse.User();
758+
user.setUsername('Alice');
759+
user.setPassword('sekrit');
760+
await user.signUp();
761+
762+
await user._linkWith('twitter', { authData });
763+
await Parse.FacebookUtils.link(user);
764+
765+
expect(Parse.FacebookUtils.isLinked(user)).toBe(true);
766+
expect(user._isLinked('twitter')).toBe(true);
767+
768+
expect(user.get('authData').twitter.id).toBe(authData.id);
769+
expect(user.get('authData').facebook.id).toBe('test');
770+
});
723771
});

src/ParseUser.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,20 @@ class ParseUser extends ParseObject {
8181
let authType;
8282
if (typeof provider === 'string') {
8383
authType = provider;
84-
provider = authProviders[provider];
84+
if (authProviders[provider]) {
85+
provider = authProviders[provider];
86+
} else {
87+
const authProvider = {
88+
restoreAuthentication() {
89+
return true;
90+
},
91+
getAuthType() {
92+
return authType;
93+
},
94+
};
95+
authProviders[authType] = authProvider;
96+
provider = authProvider;
97+
}
8598
} else {
8699
authType = provider.getAuthType();
87100
}

src/__tests__/ParseUser-test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -916,4 +916,31 @@ describe('ParseUser', () => {
916916

917917
expect(user.get('authData')).toEqual({ test: { id: 'id', access_token: 'access_token' } });
918918
});
919+
920+
it('can linkWith if no provider', async () => {
921+
ParseUser._clearCache();
922+
CoreManager.setRESTController({
923+
request() {
924+
return Promise.resolve({
925+
objectId: 'uid6',
926+
sessionToken: 'r:123abc',
927+
authData: {
928+
testProvider: {
929+
id: 'test',
930+
}
931+
}
932+
}, 200);
933+
},
934+
ajax() {}
935+
});
936+
const user = new ParseUser();
937+
await user._linkWith('testProvider', { authData: { id: 'test' } });
938+
expect(user.get('authData')).toEqual({ testProvider: { id: 'test' } });
939+
940+
jest.spyOn(user, '_linkWith');
941+
942+
await user._unlinkFrom('testProvider');
943+
const authProvider = user._linkWith.mock.calls[0][0];
944+
expect(authProvider.getAuthType()).toBe('testProvider');
945+
});
919946
});

0 commit comments

Comments
 (0)