mirror of
https://github.com/sudoxnym/habitica-self-host.git
synced 2026-04-14 19:47:03 +00:00
* Change update username API call The call no longer requires a password and also validates the username. * Implement API call to verify username without setting it * Improve coding style * Apply username verification to registration * Update error messages * Validate display names. * Fix API early Stat Point allocation (#10680) * Refactor hasClass check to common so it can be used in shared & server-side code * Check that user has selected class before allocating stat points * chore(event): end Ember Hatching Potions * chore(analytics): reenable navigation tracking * update bcrypt * Point achievement modal links to main site (#10709) * Animal ears after death (#10691) * Animal Ears purchasable with Gold if lost in Death * remove ears from pinned items when set is bought * standardise css and error handling for gems and coins * revert accidental new line * fix client tests * Reduce margin-bottom of checklist-item from 10px to -3px. (#10684) * chore(i18n): update locales * 4.61.1 * feat(content): Subscriber Items and Magic Potions * chore(sprites): compile * chore(i18n): update locales * 4.62.0 * Display notification for users to confirm their username * fix typo * WIP(usernames): Changes to address #10694 * WIP(usernames): Further changes for #10694 * fix(usernames): don't show spurious headings * Change verify username notification to new version * Improve feedback for invalid usernames * Allow user to set their username again to confirm it * Improve validation display for usernames * Temporarily move display name validation outside of schema * Improve rendering banner about sleeping in the inn See #10695 * Display settings in one column * Position inn banner when window is resized * Update inn banner handling * Fix banner offset on initial load * Fix minor issues. * Issue: 10660 - Fixed. Changed default to Please Enter A Value (#10718) * Issue: 10660 - Fixed. Changed default to Please Enter A Value * Issue: 10660 - Fixed/revision 2 Changed default to Enter A Value * chore(news): Bailey announcements * chore(i18n): update locales * 4.62.1 * adjust wiki link for usernameInfo string https://github.com/HabitRPG/habitica-private/issues/7#issuecomment-425405425 * raise coverage for tasks api calls (#10029) * - updates a group task - approval is required - updates a group task with checklist * add expect to test the new checklist length * - moves tasks to a specified position out of length * remove unused line * website getter tasks tests * re-add sanitizeUserChallengeTask * change config.json.example variable to be a string not a boolean * fix tests - pick the text / up/down props too * fix test - remove changes on text/up/down - revert sanitize condition - revert sanitization props * Change update username API call The call no longer requires a password and also validates the username. * feat(content): Subscriber Items and Magic Potions * Re-add register call * Fix merge issue * Fix issue with setting username * Implement new alert style * Display username confirmation status in settings * Add disclaimer to change username field * validate username in settings * Allow specific fields to be focused when opening site settings * Implement requested changes. * Fix merge issue * Fix failing tests * verify username when users register with username and password * Set ID for change username notification * Disable submit button if username is invalid * Improve username confirmation handling * refactor(settings): address remaining code comments on auth form * Revert "refactor(settings): address remaining code comments on auth form" This reverts commit 9b6609ad646b23d9e3e394c1856f149d9a2d0995. * Social user username (#10620) * Refactored private functions to library * Refactored social login code * Added username to social registration * Changed id library * Added new local auth check * Fixed export error. Fixed password check error * fix(settings): password not available on client * refactor(settings): more sensible placement of methods * chore(migration): script to hand out procgen usernames * fix(migration): don't give EVERYONE new names you doofus * fix(migration): limit data retrieved, be extra careful about updates * fix(migration): use missing field, not migration tag, for query * fix(migration): unused var * fix(usernames): only generate 20 characters * fix(migration): set lowerCaseUsername
148 lines
4.7 KiB
JavaScript
148 lines
4.7 KiB
JavaScript
import {
|
|
generateUser,
|
|
requester,
|
|
translate as t,
|
|
getProperty,
|
|
} from '../../../../../helpers/api-integration/v3';
|
|
import passport from 'passport';
|
|
|
|
describe('POST /user/auth/social', () => {
|
|
let api;
|
|
let user;
|
|
let endpoint = '/user/auth/social';
|
|
let randomAccessToken = '123456';
|
|
let facebookId = 'facebookId';
|
|
let googleId = 'googleId';
|
|
let network = 'NoNetwork';
|
|
|
|
beforeEach(async () => {
|
|
api = requester();
|
|
user = await generateUser();
|
|
});
|
|
|
|
it('fails if network is not supported', async () => {
|
|
await expect(api.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
})).to.eventually.be.rejected.and.eql({
|
|
code: 400,
|
|
error: 'BadRequest',
|
|
message: t('unsupportedNetwork'),
|
|
});
|
|
});
|
|
|
|
describe('facebook', () => {
|
|
before(async () => {
|
|
let expectedResult = {id: facebookId, displayName: 'a facebook user'};
|
|
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
|
network = 'facebook';
|
|
});
|
|
|
|
it('registers a new user', async () => {
|
|
const response = await api.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
});
|
|
|
|
expect(response.apiToken).to.exist;
|
|
expect(response.id).to.exist;
|
|
expect(response.newUser).to.be.true;
|
|
expect(response.username).to.exist;
|
|
|
|
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a facebook user');
|
|
await expect(getProperty('users', response.id, 'auth.local.lowerCaseUsername')).to.exist;
|
|
});
|
|
|
|
it('logs an existing user in', async () => {
|
|
let registerResponse = await api.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
});
|
|
|
|
let response = await api.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
});
|
|
|
|
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
|
expect(response.id).to.eql(registerResponse.id);
|
|
expect(response.newUser).to.be.false;
|
|
});
|
|
|
|
it('add social auth to an existing user', async () => {
|
|
let response = await user.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
});
|
|
|
|
expect(response.apiToken).to.exist;
|
|
expect(response.id).to.exist;
|
|
expect(response.newUser).to.be.false;
|
|
});
|
|
|
|
it('enrolls a new user in an A/B test', async () => {
|
|
await api.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
});
|
|
|
|
await expect(getProperty('users', user._id, '_ABtests')).to.eventually.be.a('object');
|
|
});
|
|
});
|
|
|
|
describe('google', () => {
|
|
before(async () => {
|
|
let expectedResult = {id: googleId, displayName: 'a google user'};
|
|
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
|
|
network = 'google';
|
|
});
|
|
|
|
it('registers a new user', async () => {
|
|
let response = await api.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
});
|
|
|
|
expect(response.apiToken).to.exist;
|
|
expect(response.id).to.exist;
|
|
expect(response.newUser).to.be.true;
|
|
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a google user');
|
|
});
|
|
|
|
it('logs an existing user in', async () => {
|
|
let registerResponse = await api.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
});
|
|
|
|
let response = await api.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
});
|
|
|
|
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
|
expect(response.id).to.eql(registerResponse.id);
|
|
expect(response.newUser).to.be.false;
|
|
});
|
|
|
|
it('add social auth to an existing user', async () => {
|
|
let response = await user.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
});
|
|
|
|
expect(response.apiToken).to.exist;
|
|
expect(response.id).to.exist;
|
|
expect(response.newUser).to.be.false;
|
|
});
|
|
|
|
it('enrolls a new user in an A/B test', async () => {
|
|
await api.post(endpoint, {
|
|
authResponse: {access_token: randomAccessToken}, // eslint-disable-line camelcase
|
|
network,
|
|
});
|
|
|
|
await expect(getProperty('users', user._id, '_ABtests')).to.eventually.be.a('object');
|
|
});
|
|
});
|
|
});
|