diff --git a/package-lock.json b/package-lock.json index abbdfa1cc4..cc694d3c7f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9657,13 +9657,13 @@ } }, "mongoose": { - "version": "5.10.11", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.11.tgz", - "integrity": "sha512-R5BFitKW94/S/Z48w+X+qi/eto66jWBcVEVA8nYVkBoBAPFGq7JSYP/0uso+ZHs+7XjSzTuui+SUllzxIrf9yA==", + "version": "5.10.13", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.13.tgz", + "integrity": "sha512-lvZzTj449sVWijY76StOuTKt5oP5kyy70VdM3DMgPpKNqZfkAseHxekmqBbd9YQQDVIgrIYDar9vSlxKqc75MQ==", "requires": { "bson": "^1.1.4", "kareem": "2.3.1", - "mongodb": "3.6.2", + "mongodb": "3.6.3", "mongoose-legacy-pluralize": "1.0.2", "mpath": "0.7.0", "mquery": "3.2.2", @@ -9684,9 +9684,9 @@ } }, "mongodb": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.2.tgz", - "integrity": "sha512-sSZOb04w3HcnrrXC82NEh/YGCmBuRgR+C1hZgmmv4L6dBz4BkRse6Y8/q/neXer9i95fKUBbFi4KgeceXmbsOA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz", + "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==", "requires": { "bl": "^2.2.1", "bson": "^1.1.4", diff --git a/package.json b/package.json index 5ee5f4238b..a2713fb1dd 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "method-override": "^3.0.0", "moment": "^2.29.1", "moment-recur": "^1.0.7", - "mongoose": "^5.10.11", + "mongoose": "^5.10.13", "morgan": "^1.10.0", "nconf": "^0.10.0", "node-gcm": "^1.0.3", diff --git a/test/api/unit/libs/stringUtils.test.js b/test/api/unit/libs/stringUtils.test.js index 0596cd16b9..947274df53 100644 --- a/test/api/unit/libs/stringUtils.test.js +++ b/test/api/unit/libs/stringUtils.test.js @@ -8,5 +8,10 @@ describe('stringUtils', () => { const matches = getMatchesByWordArray(message, bannedWords); expect(matches.length).to.equal(bannedWords.length); }); + it('doesn\'t flag names with accented characters', () => { + const name = 'TESTPLACEHOLDERSWEARWORDHEREé'; + const matches = getMatchesByWordArray(name, bannedWords); + expect(matches.length).to.equal(0); + }); }); }); diff --git a/test/api/v3/integration/analytics/POST-analytics_track_eventName.test.js b/test/api/v3/integration/analytics/POST-analytics_track_eventName.test.js new file mode 100644 index 0000000000..eb00ee8927 --- /dev/null +++ b/test/api/v3/integration/analytics/POST-analytics_track_eventName.test.js @@ -0,0 +1,28 @@ +import { + generateUser, + requester, + translate as t, +} from '../../../../helpers/api-integration/v3'; +import { mockAnalyticsService as analytics } from '../../../../../website/server/libs/analyticsService'; + +describe('POST /analytics/track/:eventName', () => { + it('requires authentication', async () => { + await expect(requester().post('/analytics/track/event')).to.eventually.be.rejected.and.eql({ + code: 401, + error: 'NotAuthorized', + message: t('missingAuthHeaders'), + }); + }); + + it('calls res.analytics', async () => { + const user = await generateUser(); + sandbox.spy(analytics, 'track'); + + const requestWithHeaders = requester(user, { 'x-client': 'habitica-web' }); + await requestWithHeaders.post('/analytics/track/eventName', { data: 'example' }, { 'x-client': 'habitica-web' }); + expect(analytics.track).to.be.calledOnce; + expect(analytics.track).to.be.calledWith('eventName', sandbox.match({ data: 'example' })); + + sandbox.restore(); + }); +}); diff --git a/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js b/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js index afae509347..53da2a5942 100644 --- a/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js +++ b/test/api/v3/integration/challenges/POST-challenges_challengeId_winner_winnerId.test.js @@ -103,7 +103,15 @@ describe('POST /challenges/:challengeId/winner/:winnerId', () => { await expect(winningUser.sync()).to.eventually.have.nested.property('achievements.challenges').to.include(challenge.name); // 2 because winningUser just joined the challenge, which now awards an achievement expect(winningUser.notifications.length).to.equal(2); - expect(winningUser.notifications[1].type).to.equal('WON_CHALLENGE'); + + const notif = winningUser.notifications[1]; + expect(notif.type).to.equal('WON_CHALLENGE'); + expect(notif.data).to.eql({ + id: challenge._id, + name: challenge.name, + prize: challenge.prize, + leader: challenge.leader, + }); }); it('gives winner gems as reward', async () => { diff --git a/test/helpers/api-integration/requester.js b/test/helpers/api-integration/requester.js index a01aa1e227..f5c63b9d14 100644 --- a/test/helpers/api-integration/requester.js +++ b/test/helpers/api-integration/requester.js @@ -41,6 +41,7 @@ function _requestMaker (user, method, additionalSets = {}) { || route.indexOf('/amazon') === 0 || route.indexOf('/stripe') === 0 || route.indexOf('/qr-code') === 0 + || route.indexOf('/analytics') === 0 ) { url += `${route}`; } else { diff --git a/website/client/package-lock.json b/website/client/package-lock.json index c53ef7ebf0..e8450d4a35 100644 --- a/website/client/package-lock.json +++ b/website/client/package-lock.json @@ -4,11 +4,24 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@amplitude/types": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@amplitude/types/-/types-1.0.4.tgz", + "integrity": "sha512-iWdgTXiE0T/QCK88g2ezJEhJpYHDvDs0StVVPu1ygcl6qYzk/8xrNvbeEibiIBT8t/GJ8FtH5ZIPx3c4CMjlig==" + }, "@amplitude/ua-parser-js": { "version": "0.7.24", "resolved": "https://registry.npmjs.org/@amplitude/ua-parser-js/-/ua-parser-js-0.7.24.tgz", "integrity": "sha512-VbQuJymJ20WEw0HtI2np7EdC3NJGUWi8+Xdbc7uk8WfMIF308T0howpzkQ3JFMN7ejnrcSM/OyNGveeE3TP3TA==" }, + "@amplitude/utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@amplitude/utils/-/utils-1.0.5.tgz", + "integrity": "sha512-leo4meeTAvp4W+UWk7EcWaJKuuJ3HqbNglRJPVAUYXaoCs2UzCnCVvjj5rUBN+Mhe0pAmkpEHHaS/1iv2prcKA==", + "requires": { + "@amplitude/types": "^1.0.4" + } + }, "@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", @@ -6952,11 +6965,12 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, "amplitude-js": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-7.3.1.tgz", - "integrity": "sha512-dsJU9MdtDDAOtKnbHrJuVBgsL5UGxD1P2B7doGdAQ1hxxT/5mFrmJTFzi1tKe+2ir3QtcRa9B0qvH8TMsGw22A==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/amplitude-js/-/amplitude-js-7.3.2.tgz", + "integrity": "sha512-OngxKt9FUMnskD/G38bgPuGTIMV29GQXct+1KvBCYzjAl/pMR6LDzAJA2y7BwVmGUDeWcutGr6umeWaj2Pgdqg==", "requires": { "@amplitude/ua-parser-js": "0.7.24", + "@amplitude/utils": "^1.0.5", "blueimp-md5": "^2.10.0", "query-string": "5" }, @@ -8234,9 +8248,9 @@ "integrity": "sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==" }, "bootstrap-vue": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.18.1.tgz", - "integrity": "sha512-oYKAhEnNuCxtF4gxsdLzijhQpFk7UYPvzhwZvUbnPbZ1eWu2dsc3+fRkY9PMowt5OJRtuVb7ov3lpsI2fraYsA==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.19.0.tgz", + "integrity": "sha512-IjAXUSrRU5Qu9x3uwUcoj6LtysKbCVeWoJOsODyI/WokStUr95M+tTIajXUjIrB/Nsk0fS+RNvZnm2sWeNFrhg==", "requires": { "@nuxt/opencollective": "^0.3.2", "bootstrap": ">=4.5.3 <5.0.0", @@ -9517,9 +9531,9 @@ } }, "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.7.0.tgz", + "integrity": "sha512-NwS7fI5M5B85EwpWuIwJN4i/fbisQUwLwiSNUWeXlkAZ0sbBjLEvLvFLf1uzAUV66PcEPt4xCGCmOZSxVf3xzA==" }, "core-js-compat": { "version": "3.6.4", @@ -18371,9 +18385,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.28.0.tgz", - "integrity": "sha512-9FWX/0wuE1KxwfiP02chZhHaPzu6adpx9+wGch7WMOuHy5npOo0UapRI3FNSHva2CczaYJu2yNUBN8cCSqHz/A==", + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.29.0.tgz", + "integrity": "sha512-ZpwAUFgnvAUCdkjwPREny+17BpUj8nh5Yr6zKPGtLNTLrmtoRYIjm7njP24COhjJldjwW1dcv52Lpf4tNZVVRA==", "requires": { "chokidar": ">=2.0.0 <4.0.0" } @@ -20949,10 +20963,9 @@ } }, "vue-loader-v16": { - "version": "npm:vue-loader@16.0.0-beta.9", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-beta.9.tgz", - "integrity": "sha512-mu9pg6554GbXDSO8LlxkQM6qUJzUkb/A0FJc9LgRqnU9MCnhzEXwCt1Zx5NObvFpzs2mH2dH/uUCDwL8Qaz9sA==", - "optional": true, + "version": "npm:vue-loader@16.0.0-rc.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.0.0-rc.1.tgz", + "integrity": "sha512-yR+BS90EOXTNieasf8ce9J3TFCpm2DGqoqdbtiwQ33hon3FyIznLX7sKavAq1VmfBnOeV6It0Htg4aniv8ph1g==", "requires": { "chalk": "^4.1.0", "hash-sum": "^2.0.0", @@ -20963,7 +20976,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "optional": true, "requires": { "color-convert": "^2.0.1" } @@ -20972,7 +20984,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "optional": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -20982,7 +20993,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "optional": true, "requires": { "color-name": "~1.1.4" } @@ -20990,26 +21000,22 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "optional": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "optional": true + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "optional": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "loader-utils": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "optional": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -21020,7 +21026,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "optional": true, "requires": { "has-flag": "^4.0.0" } @@ -21037,9 +21042,9 @@ } }, "vue-router": { - "version": "3.4.8", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.8.tgz", - "integrity": "sha512-3BsR84AqarcmweXjItxw3jwQsiYNssYg090yi4rlzTnCJxmHtkyCvhNz9Z7qRSOkmiV485KkUCReTp5AjNY4wg==" + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.9.tgz", + "integrity": "sha512-CGAKWN44RqXW06oC+u4mPgHLQQi2t6vLD/JbGRDAXm0YpMv0bgpKuU5bBd7AvMgfTz9kXVRIWKHqRwGEb8xFkA==" }, "vue-style-loader": { "version": "4.1.2", diff --git a/website/client/package.json b/website/client/package.json index 4f15e676b6..13d89e44fd 100644 --- a/website/client/package.json +++ b/website/client/package.json @@ -24,14 +24,14 @@ "@vue/cli-plugin-unit-mocha": "^4.5.8", "@vue/cli-service": "^4.5.8", "@vue/test-utils": "1.0.0-beta.29", - "amplitude-js": "^7.3.1", + "amplitude-js": "^7.3.2", "axios": "^0.21.0", "axios-progress-bar": "^1.2.0", "babel-eslint": "^10.1.0", "bootstrap": "^4.5.3", - "bootstrap-vue": "^2.18.1", + "bootstrap-vue": "^2.19.0", "chai": "^4.1.2", - "core-js": "^3.6.5", + "core-js": "^3.7.0", "eslint": "^6.8.0", "eslint-config-habitrpg": "^6.2.0", "eslint-plugin-mocha": "^5.3.0", @@ -44,7 +44,7 @@ "lodash": "^4.17.20", "moment": "^2.29.1", "nconf": "^0.10.0", - "sass": "^1.28.0", + "sass": "^1.29.0", "sass-loader": "^8.0.2", "smartbanner.js": "^1.16.0", "svg-inline-loader": "^0.8.2", @@ -56,7 +56,7 @@ "vue": "^2.6.12", "vue-cli-plugin-storybook": "^0.6.1", "vue-mugen-scroll": "^0.2.6", - "vue-router": "^3.4.8", + "vue-router": "^3.4.9", "vue-template-compiler": "^2.6.12", "vuedraggable": "^2.24.3", "vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#153d339e4dbebb73733658aeda1d5b7fcc55b0a0", diff --git a/website/client/src/app.vue b/website/client/src/app.vue index 9db3e96f7e..5ee9437eab 100644 --- a/website/client/src/app.vue +++ b/website/client/src/app.vue @@ -38,7 +38,7 @@