mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-10-30 20:52:29 +01:00
@@ -27,7 +27,7 @@ function uploadFile (buffer, fileName) {
|
||||
if (error) {
|
||||
reject(error);
|
||||
} else {
|
||||
// console.info(`${fileName} uploaded to ${BUCKET_NAME} succesfully.`);
|
||||
// console.info(`${fileName} uploaded to ${BUCKET_NAME} successfully.`);
|
||||
resolve(fileName);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -155,7 +155,7 @@ describe('analyticsService', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('sets Unkown if headers are not passed in', () => {
|
||||
it('sets Unknown if headers are not passed in', () => {
|
||||
delete data.headers;
|
||||
|
||||
return analyticsService.track(eventType, data)
|
||||
@@ -476,7 +476,7 @@ describe('analyticsService', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('sets Unkown if headers are not passed in', () => {
|
||||
it('sets Unknown if headers are not passed in', () => {
|
||||
delete data.headers;
|
||||
|
||||
return analyticsService.trackPurchase(data)
|
||||
|
||||
@@ -697,7 +697,7 @@ describe('payments/index', () => {
|
||||
.calledWith(recipient, { receiverMsg: msg, senderMsg: msg, save: false });
|
||||
});
|
||||
|
||||
it('sends a message from purchaser to recipient wtih custom message', async () => {
|
||||
it('sends a message from purchaser to recipient with custom message', async () => {
|
||||
data.gift.message = 'giftmessage';
|
||||
|
||||
await api.buyGems(data);
|
||||
|
||||
@@ -251,7 +251,7 @@ describe('POST /challenges', () => {
|
||||
expect(groupLeader.balance).to.eql(oldUserBalance);
|
||||
});
|
||||
|
||||
it('sets all properites of the challenge as passed', async () => {
|
||||
it('sets all properties of the challenge as passed', async () => {
|
||||
const name = 'Test Challenge';
|
||||
const shortName = 'TC Label';
|
||||
const description = 'Test Description';
|
||||
|
||||
@@ -177,7 +177,7 @@ describe('GET /groups/:id', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('removes non-existant guild from user\'s guild list', async () => {
|
||||
it('removes non-existent guild from user\'s guild list', async () => {
|
||||
const guildId = generateUUID();
|
||||
|
||||
await user.update({
|
||||
@@ -197,7 +197,7 @@ describe('GET /groups/:id', () => {
|
||||
expect(user.guilds).to.not.include(guildId);
|
||||
});
|
||||
|
||||
it('removes non-existant party from user\'s party object', async () => {
|
||||
it('removes non-existent party from user\'s party object', async () => {
|
||||
const partyId = generateUUID();
|
||||
|
||||
await user.update({
|
||||
|
||||
@@ -210,7 +210,7 @@ describe('POST /groups/:groupId/leave', () => {
|
||||
expect(userWithoutInvitation.invitations.guilds).to.not.be.empty;
|
||||
});
|
||||
|
||||
it('deletes non existant guild from user when user tries to leave', async () => {
|
||||
it('deletes non existent guild from user when user tries to leave', async () => {
|
||||
const nonExistentGuildId = generateUUID();
|
||||
const userWithNonExistentGuild = await generateUser({ guilds: [nonExistentGuildId] });
|
||||
expect(userWithNonExistentGuild.guilds).to.contain(nonExistentGuildId);
|
||||
@@ -258,7 +258,7 @@ describe('POST /groups/:groupId/leave', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('deletes non existant party from user when user tries to leave', async () => {
|
||||
it('deletes non existent party from user when user tries to leave', async () => {
|
||||
const nonExistentPartyId = generateUUID();
|
||||
const userWithNonExistentParty = await generateUser({ 'party._id': nonExistentPartyId });
|
||||
expect(userWithNonExistentParty.party._id).to.eql(nonExistentPartyId);
|
||||
|
||||
@@ -29,7 +29,7 @@ describe('payments - amazon - #checkout', () => {
|
||||
amzLib.checkout.restore();
|
||||
});
|
||||
|
||||
it('makes a purcahse with amazon checkout', async () => {
|
||||
it('makes a purchase with amazon checkout', async () => {
|
||||
user = await generateUser({
|
||||
'profile.name': 'sender',
|
||||
'purchased.plan.customerId': 'customer-id',
|
||||
|
||||
@@ -120,7 +120,7 @@ describe('DELETE /tasks/:id', () => {
|
||||
});
|
||||
|
||||
context('task cannot be deleted', () => {
|
||||
it('cannot delete a non-existant task', async () => {
|
||||
it('cannot delete a non-existent task', async () => {
|
||||
await expect(user.del('/tasks/550e8400-e29b-41d4-a716-446655440000')).to.eventually.be.rejected.and.eql({
|
||||
code: 404,
|
||||
error: 'NotFound',
|
||||
|
||||
@@ -39,7 +39,7 @@ describe('GET /tasks/:id', () => {
|
||||
});
|
||||
|
||||
context('task cannot be accessed', () => {
|
||||
it('cannot get a non-existant task', async () => {
|
||||
it('cannot get a non-existent task', async () => {
|
||||
const dummyId = generateUUID();
|
||||
|
||||
await expect(user.get(`/tasks/${dummyId}`)).to.eventually.be.rejected.and.eql({
|
||||
|
||||
@@ -27,7 +27,7 @@ describe('DELETE /tasks/:id', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('cannot delete a non-existant task', async () => {
|
||||
it('cannot delete a non-existent task', async () => {
|
||||
await expect(user.del(`/tasks/${generateUUID()}`)).to.eventually.be.rejected.and.eql({
|
||||
code: 404,
|
||||
error: 'NotFound',
|
||||
|
||||
@@ -16,7 +16,7 @@ describe('PUT /user/auth/update-email', () => {
|
||||
const newEmail = 'SOmE-nEw-emAIl_2@example.net';
|
||||
const oldPassword = 'password'; // from habitrpg/test/helpers/api-integration/v3/object-generators.js
|
||||
|
||||
context('Local Authenticaion User', async () => {
|
||||
context('Local Authentication User', async () => {
|
||||
let user;
|
||||
|
||||
beforeEach(async () => {
|
||||
|
||||
@@ -15,7 +15,7 @@ describe('getDebuffPotionItems', () => {
|
||||
|
||||
for (const key of Object.keys(TRANSFORMATION_DEBUFFS_LIST)) {
|
||||
const debuff = TRANSFORMATION_DEBUFFS_LIST[key];
|
||||
// Here we itterate whole object to dynamicaly create test suites as
|
||||
// Here we itterate whole object to dynamically create test suites as
|
||||
// it described in dock of mocha
|
||||
// https://mochajs.org/#dynamically-generating-tests
|
||||
// That's why we have eslint-disable here
|
||||
|
||||
@@ -54,7 +54,7 @@ describe('shared.ops.unlock', () => {
|
||||
}
|
||||
});
|
||||
|
||||
// disabled untill fully implemente
|
||||
// disabled until fully implemente
|
||||
xit('returns an error when user already owns items in a full set', done => {
|
||||
try {
|
||||
unlock(user, { query: { path: unlockPath } });
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
:avatar-only="true"
|
||||
:with-background="true"
|
||||
/>
|
||||
<!-- @TOOD: Sleep +generatedAvatar({sleep:true})-->
|
||||
<!-- @TODO: Sleep +generatedAvatar({sleep:true})-->
|
||||
<span class="knockout"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -71,8 +71,8 @@ export default {
|
||||
this.$root.$emit('bv::hide::modal', 'streak');
|
||||
},
|
||||
suppressModals () {
|
||||
const surpress = !!this.user.preferences.suppressModals.streak;
|
||||
this.$store.dispatch('user:set', { 'preferences.suppressModals.streak': surpress });
|
||||
const suppress = !!this.user.preferences.suppressModals.streak;
|
||||
this.$store.dispatch('user:set', { 'preferences.suppressModals.streak': suppress });
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -700,7 +700,7 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
// @TODO: implement langauge and invite accepting
|
||||
// @TODO: implement language and invite accepting
|
||||
// var url = ApiUrl.get() + "/api/v4/user/auth/local/register";
|
||||
// if (location.search && location.search.indexOf('Invite=') !== -1)
|
||||
// { // matches groupInvite and partyInvite
|
||||
|
||||
@@ -282,7 +282,7 @@ export default {
|
||||
const promises = [];
|
||||
const noProfilesLoaded = Object.keys(this.cachedProfileData).length === 0;
|
||||
|
||||
// @TODO: write an explination
|
||||
// @TODO: write an explanation
|
||||
// @TODO: Remove this after enough messages are cached
|
||||
if (
|
||||
!noProfilesLoaded
|
||||
|
||||
@@ -329,7 +329,7 @@
|
||||
<div class="task-option">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input
|
||||
id="excercise"
|
||||
id="exercise"
|
||||
v-model="taskCategories"
|
||||
class="custom-control-input"
|
||||
type="checkbox"
|
||||
@@ -338,7 +338,7 @@
|
||||
<label
|
||||
v-once
|
||||
class="custom-control-label"
|
||||
for="excercise"
|
||||
for="exercise"
|
||||
>{{ $t('exercise') }}</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -499,7 +499,7 @@ export default {
|
||||
},
|
||||
watch: {
|
||||
groupId () {
|
||||
// @TOOD: We might not need this since groupId is computed now
|
||||
// @TODO: We might not need this since groupId is computed now
|
||||
this.getMembers();
|
||||
},
|
||||
challengeId () {
|
||||
|
||||
@@ -341,7 +341,7 @@ export default {
|
||||
const { firstRender } = viewOptions;
|
||||
const { itemsInFirstPosition } = viewOptions;
|
||||
|
||||
// Render selected items in first postion only for the first render
|
||||
// Render selected items in first position only for the first render
|
||||
if (itemsInFirstPosition.indexOf(ownedItem.key) !== -1 && firstRender === false) {
|
||||
gearItemsByType[type].unshift(ownedItem);
|
||||
} else if (isEquipped === true && firstRender === true) {
|
||||
@@ -382,7 +382,7 @@ export default {
|
||||
const { firstRender } = viewOptions;
|
||||
const { itemsInFirstPosition } = viewOptions;
|
||||
|
||||
// Render selected items in first postion only for the first render
|
||||
// Render selected items in first position only for the first render
|
||||
if (itemsInFirstPosition.indexOf(ownedItem.key) !== -1 && firstRender === false) {
|
||||
gearItemsByClass[klass].unshift(ownedItem);
|
||||
} else if (isEquipped === true && firstRender === true) {
|
||||
|
||||
@@ -29,7 +29,7 @@ export function setUpLogging () { // eslint-disable-line import/prefer-default-e
|
||||
Vue.config.errorHandler = (err, vm, info) => {
|
||||
console.error('Unhandled error in Vue.js code.');
|
||||
console.error('Error:', err);
|
||||
console.error('Component where it occured:', vm);
|
||||
console.error('Component where it occurred:', vm);
|
||||
console.error('Info:', info);
|
||||
|
||||
_LTracker.push({
|
||||
|
||||
@@ -165,7 +165,7 @@ export default {
|
||||
}
|
||||
|
||||
return null;
|
||||
// @TOOD: User.sync();
|
||||
// @TODO: User.sync();
|
||||
},
|
||||
castCancel () {
|
||||
this.potionClickMode = false;
|
||||
|
||||
@@ -112,7 +112,7 @@ context('avatar.vue', () => {
|
||||
};
|
||||
});
|
||||
|
||||
it('returns if showing equiped gear', () => {
|
||||
it('returns if showing equipped gear', () => {
|
||||
expect(vm.costumeClass).to.equal('equipped');
|
||||
});
|
||||
it('returns if wearing a costume', () => {
|
||||
|
||||
@@ -540,7 +540,7 @@
|
||||
"armorSpecialWinter2016MageNotes": "The wisest wizard keeps well-bundled in the winter wind. Increases Intelligence by <%= int %>. Limited Edition 2015-2016 Winter Gear.",
|
||||
"armorSpecialWinter2016HealerText": "Festive Fairy Cloak",
|
||||
"armorSpecialWinter2016HealerNotes": "Festive Fairies wrap their body wings around themselves for protection as they use their head wings to catch headwinds and fly around Habitica at speeds of up to 100 mph, delivering gifts and spraying everyone with confetti. How droll. Increases Constitution by <%= con %>. Limited Edition 2015-2016 Winter Gear.",
|
||||
"armorSpecialSpring2016RogueText": "Canine Camouflauge Suit",
|
||||
"armorSpecialSpring2016RogueText": "Canine Camouflage Suit",
|
||||
"armorSpecialSpring2016RogueNotes": "A clever pup knows to choose a brighter guise for concealment when everything is green and vibrant. Increases Perception by <%= per %>. Limited Edition 2016 Spring Gear.",
|
||||
"armorSpecialSpring2016WarriorText": "Mighty Mail",
|
||||
"armorSpecialSpring2016WarriorNotes": "Though you be but little, you are fierce! Increases Constitution by <%= con %>. Limited Edition 2016 Spring Gear.",
|
||||
|
||||
@@ -66,7 +66,7 @@ export function startOfWeek (options = {}) {
|
||||
/*
|
||||
This is designed for use with any date that has an important time portion
|
||||
(e.g., when comparing the current date-time with the previous cron's date-time
|
||||
for determing if cron should run now).
|
||||
for determining if cron should run now).
|
||||
It changes the time portion of the date-time to be the Custom Day Start hour,
|
||||
so that the date-time is now the user's correct start of day.
|
||||
It SUBTRACTS a day if the date-time's original hour is before CDS
|
||||
|
||||
@@ -157,7 +157,7 @@ export function togglePinnedItem (user, { item, type, path }, req = {}) {
|
||||
}
|
||||
|
||||
if (isOfficialPinned) {
|
||||
// if an offical item is also present in the user.pinnedItems array
|
||||
// if an official item is also present in the user.pinnedItems array
|
||||
const itemInUserItems = pathExistsInArray(user.pinnedItems, path);
|
||||
|
||||
if (itemInUserItems !== -1) {
|
||||
|
||||
@@ -82,7 +82,7 @@ async function saveContentToDisk (language, content) {
|
||||
* the user's configured language.
|
||||
*
|
||||
* @apiSuccess {Object} data Various data about the content of Habitica. The content route
|
||||
* contains many keys, but the data listed below are the recomended data to use.
|
||||
* contains many keys, but the data listed below are the recommended data to use.
|
||||
* @apiSuccess {Object} data.mystery The mystery sets awarded to paying subscribers.
|
||||
* @apiSuccess {Object} data.gear The gear that can be equipped.
|
||||
* @apiSuccess {Object} data.gear.tree Detailed information about the gear, organized by type.
|
||||
@@ -101,7 +101,7 @@ async function saveContentToDisk (language, content) {
|
||||
* @apiSuccess {Object} data.food All the food.
|
||||
* @apiSuccess {Array} data.userCanOwnQuestCategories The types of quests that a user can own.
|
||||
* @apiSuccess {Object} data.quests Data about the quests.
|
||||
* @apiSuccess {Object} data.appearances Data about the apperance properties.
|
||||
* @apiSuccess {Object} data.appearances Data about the appearance properties.
|
||||
* @apiSuccess {Object} data.appearances.hair Data about available hair options.
|
||||
* @apiSuccess {Object} data.appearances.shirt Data about available shirt options.
|
||||
* @apiSuccess {Object} data.appearances.size Data about available body size options.
|
||||
@@ -109,7 +109,7 @@ async function saveContentToDisk (language, content) {
|
||||
* @apiSuccess {Object} data.appearances.chair Data about available chair options.
|
||||
* @apiSuccess {Object} data.appearances.background Data about available background options.
|
||||
* @apiSuccess {Object} data.backgrounds Data about the background sets.
|
||||
* @apiSuccess {Object} data.subscriptionBlocks Data about the various subscirption blocks.
|
||||
* @apiSuccess {Object} data.subscriptionBlocks Data about the various subscriptions blocks.
|
||||
*
|
||||
*/
|
||||
api.getContent = {
|
||||
|
||||
@@ -1049,7 +1049,7 @@ api.removeGroupMember = {
|
||||
*
|
||||
* @apiSuccess {Array} data The invites
|
||||
* @apiSuccess {Object} data[0] If the invitation was a User ID, you'll receive back an object.
|
||||
* You'll receive one Object for each succesful User ID invite.
|
||||
* You'll receive one Object for each successful User ID invite.
|
||||
* @apiSuccess {String} data[1] If the invitation was an email, you'll receive back the email.
|
||||
* You'll receive one String for each successful email invite.
|
||||
*
|
||||
|
||||
@@ -267,7 +267,7 @@ api.updateHero = {
|
||||
while (tierDiff) {
|
||||
hero.balance += gemsPerTier[newTier] / 4; // balance is in $
|
||||
tierDiff -= 1;
|
||||
newTier -= 1; // give them gems for the next tier down if they weren't aready that tier
|
||||
newTier -= 1; // give them gems for the next tier down if they weren't already that tier
|
||||
}
|
||||
|
||||
hero.addNotification('NEW_CONTRIBUTOR_LEVEL');
|
||||
|
||||
@@ -486,7 +486,7 @@ api.getInvitesForGroup = {
|
||||
* until you get less than 30 results.
|
||||
* BETA You can also use ?includeAllMembers=true. This option is currently in BETA
|
||||
* and may be removed in future.
|
||||
* Its use is discouraged and its performaces are not optimized especially for large challenges.
|
||||
* Its use is discouraged and its performances are not optimized especially for large challenges.
|
||||
*
|
||||
* @apiName GetMembersForChallenge
|
||||
* @apiGroup Member
|
||||
|
||||
@@ -989,7 +989,7 @@ api.purchase = {
|
||||
if (!canGetGems) throw new NotAuthorized(res.t('groupPolicyCannotGetGems'));
|
||||
}
|
||||
|
||||
// Req is currently used as options. Slighly confusing, but this will solve that for now.
|
||||
// Req is currently used as options. Slightly confusing, but this will solve that for now.
|
||||
let quantity = 1;
|
||||
if (req.body.quantity) quantity = req.body.quantity;
|
||||
req.quantity = quantity;
|
||||
|
||||
@@ -27,7 +27,7 @@ const api = {};
|
||||
* @apiDefine DataExport Data Export
|
||||
* These routes allow you to download backups of your data.
|
||||
*
|
||||
* **Note:** They are intented to be used on the website only and as such are part
|
||||
* **Note:** They are intended to be used on the website only and as such are part
|
||||
* of the private API and may change at any time.
|
||||
*/
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ async function registerLocal (req, res, { isV3 = false }) {
|
||||
const { password } = req.body;
|
||||
|
||||
// Get the lowercase version of username to check that we do not have duplicates
|
||||
// So we can search for it in the database and then reject the choosen
|
||||
// So we can search for it in the database and then reject the chosen
|
||||
// username if 1 or more results are found
|
||||
email = email.toLowerCase();
|
||||
username = username.trim();
|
||||
|
||||
@@ -10,7 +10,7 @@ export const translations = {};
|
||||
// Store MomentJS localization files
|
||||
export const momentLangs = {};
|
||||
|
||||
// Handle differencies in language codes between MomentJS and /locales
|
||||
// Handle differences in language codes between MomentJS and /locales
|
||||
const momentLangsMapping = {
|
||||
en: 'en-gb',
|
||||
en_GB: 'en-gb', // eslint-disable-line camelcase
|
||||
|
||||
@@ -268,7 +268,7 @@ export function syncableAttrs (task) {
|
||||
*
|
||||
* @param order The list of ordered tasks
|
||||
* @param taskId The Task._id of the task to move
|
||||
* @param to A integer specifiying the index to move the task to
|
||||
* @param to A integer specifying the index to move the task to
|
||||
*
|
||||
* @return Empty
|
||||
*/
|
||||
|
||||
@@ -84,7 +84,7 @@ export default function errorHandler (err, req, res, next) { // eslint-disable-l
|
||||
jsonRes.errors = responseErr.errors;
|
||||
}
|
||||
|
||||
// In some occasions like when invalid JSON is supplied `res.respond` might be not yet avalaible,
|
||||
// In some occasions like when invalid JSON is supplied `res.respond` might be not yet available,
|
||||
// in this case we use the standard res.status(...).json(...)
|
||||
return res.status(responseErr.httpCode).json(jsonRes);
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ schema.plugin(baseModel, {
|
||||
|
||||
schema.pre('init', chal => {
|
||||
// The Vue website makes the summary be mandatory for all new challenges, but the
|
||||
// Angular website did not, and the API does not yet for backwards-compatibilty.
|
||||
// Angular website did not, and the API does not yet for backwards-compatibility.
|
||||
// When any challenge without a summary is fetched from the database, this code
|
||||
// supplies the name as the summary. This can be removed when all challenges have
|
||||
// a summary and the API makes it mandatory (a breaking change!)
|
||||
|
||||
@@ -158,7 +158,7 @@ schema.plugin(baseModel, {
|
||||
|
||||
schema.pre('init', group => {
|
||||
// The Vue website makes the summary be mandatory for all new groups, but the
|
||||
// Angular website did not, and the API does not yet for backwards-compatibilty.
|
||||
// Angular website did not, and the API does not yet for backwards-compatibility.
|
||||
// When any guild without a summary is fetched from the database, this code
|
||||
// supplies the name as the summary. This can be removed when all guilds have
|
||||
// a summary and the API makes it mandatory (a breaking change!)
|
||||
|
||||
@@ -329,7 +329,7 @@ schema.statics.addComputedStatsToJSONObj = function addComputedStatsToUserJSONOb
|
||||
// This creates some odd Dependency Injection issues. To counter that,
|
||||
// we use the user as the third layer
|
||||
// To negotiate between the payment providers and the payment helper
|
||||
// (which probably has too many responsiblities)
|
||||
// (which probably has too many responsibilities)
|
||||
// In summary, currently is is best practice to use this method to cancel a user subscription,
|
||||
// rather than calling the
|
||||
// payment helper.
|
||||
|
||||
Reference in New Issue
Block a user