diff --git a/common/locales/en/challenge.json b/common/locales/en/challenge.json index 7504e2ad9c2..0fb8982246a 100644 --- a/common/locales/en/challenge.json +++ b/common/locales/en/challenge.json @@ -78,5 +78,6 @@ "userTasksNoChallengeId": "When \"tasksOwner\" is \"user\" \"challengeId\" can't be passed.", "onlyChalLeaderEditTasks": "Tasks belonging to a challenge can only be edited by the leader.", "userAlreadyInChallenge": "User is already participating in this challenge.", - "cantOnlyUnlinkChalTask": "Only broken challenges tasks can be unlinked." + "cantOnlyUnlinkChalTask": "Only broken challenges tasks can be unlinked.", + "shortNameTooShort": "Short Name must have at least 3 characters." } diff --git a/test/api/v3/integration/challenges/POST-challenges.test.js b/test/api/v3/integration/challenges/POST-challenges.test.js index 283db9333ec..a97578eef5a 100644 --- a/test/api/v3/integration/challenges/POST-challenges.test.js +++ b/test/api/v3/integration/challenges/POST-challenges.test.js @@ -115,7 +115,7 @@ describe('POST /challenges', () => { let chal = await groupMember.post('/challenges', { group: group._id, name: 'Test Challenge', - shortName: 'TC', + shortName: 'TC Label', }); expect(chal.leader).to.eql({ @@ -131,7 +131,7 @@ describe('POST /challenges', () => { await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', - shortName: 'TC', + shortName: 'TC Label', prize: 0, }); @@ -143,7 +143,7 @@ describe('POST /challenges', () => { await expect(groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', - shortName: 'TC', + shortName: 'TC Label', prize: 20, })).to.eventually.be.rejected.and.eql({ code: 401, @@ -160,7 +160,7 @@ describe('POST /challenges', () => { await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', - shortName: 'TC', + shortName: 'TC Label', prize, }); @@ -175,7 +175,7 @@ describe('POST /challenges', () => { await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', - shortName: 'TC', + shortName: 'TC Label', prize, }); @@ -191,7 +191,7 @@ describe('POST /challenges', () => { await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', - shortName: 'TC', + shortName: 'TC Label', prize, }); @@ -205,7 +205,7 @@ describe('POST /challenges', () => { await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', - shortName: 'TC', + shortName: 'TC Label', }); await expect(group.sync()).to.eventually.have.property('challengeCount', oldChallengeCount + 1); @@ -221,7 +221,7 @@ describe('POST /challenges', () => { let challenge = await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', - shortName: 'TC', + shortName: 'TC Label', official: true, }); @@ -232,7 +232,7 @@ describe('POST /challenges', () => { let challenge = await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', - shortName: 'TC', + shortName: 'TC Label', official: true, }); @@ -265,7 +265,7 @@ describe('POST /challenges', () => { it('sets all properites of the challenge as passed', async () => { let name = 'Test Challenge'; - let shortName = 'TC'; + let shortName = 'TC Label'; let description = 'Test Description'; let prize = 4; @@ -299,7 +299,7 @@ describe('POST /challenges', () => { let challenge = await groupLeader.post('/challenges', { group: group._id, name: 'Test Challenge', - shortName: 'TC', + shortName: 'TC Label', }); await expect(groupLeader.sync()).to.eventually.have.property('challenges').to.include(challenge._id); diff --git a/test/spec/controllers/challengesCtrlSpec.js b/test/spec/controllers/challengesCtrlSpec.js index 641df26a253..ec63ee20c4f 100644 --- a/test/spec/controllers/challengesCtrlSpec.js +++ b/test/spec/controllers/challengesCtrlSpec.js @@ -344,6 +344,7 @@ describe('Challenges Controller', function() { it("opens an alert box if challenge.group is not specified", function() { var challenge = specHelper.newChallenge({ name: 'Challenge without a group', + shortName: 'chal without group', group: null }); @@ -356,6 +357,7 @@ describe('Challenges Controller', function() { it("opens an alert box if isNew and user does not have enough gems", function() { var challenge = specHelper.newChallenge({ name: 'Challenge without enough gems', + shortName: 'chal without gem', prize: 5 }); @@ -372,6 +374,7 @@ describe('Challenges Controller', function() { var challenge = specHelper.newChallenge({ _id: 'challenge-has-id-so-its-not-new', name: 'Challenge without enough gems', + shortName: 'chal without gem', prize: 5, }); @@ -385,6 +388,7 @@ describe('Challenges Controller', function() { it("saves the challenge if user has enough gems and challenge is new", function() { var challenge = specHelper.newChallenge({ name: 'Challenge without enough gems', + shortName: 'chal without gem', prize: 5, }); @@ -400,6 +404,7 @@ describe('Challenges Controller', function() { var challenge = specHelper.newChallenge({ name: 'Challenge', + shortName: 'chal', }); setTimeout(function() { @@ -419,6 +424,7 @@ describe('Challenges Controller', function() { it('saves new challenge and syncs User', function(done) { var challenge = specHelper.newChallenge(); + challenge.shortName = 'chal'; setTimeout(function() { expect(User.sync).to.be.calledOnce; @@ -432,6 +438,7 @@ describe('Challenges Controller', function() { sinon.stub(notification, 'text'); var challenge = specHelper.newChallenge(); + challenge.shortName = 'chal'; setTimeout(function() { expect(notification.text).to.be.calledOnce; diff --git a/website/client/js/controllers/challengesCtrl.js b/website/client/js/controllers/challengesCtrl.js index aa36cb32a89..bcc62eca726 100644 --- a/website/client/js/controllers/challengesCtrl.js +++ b/website/client/js/controllers/challengesCtrl.js @@ -120,6 +120,8 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', $scope.save = function(challenge) { if (!challenge.group) return alert(window.env.t('selectGroup')); + if (!challenge.shortName || challenge.shortName.length < 3) return alert(window.env.t('shortNameTooShort')); + var isNew = !challenge._id; if(isNew && challenge.prize > $scope.maxPrize) { diff --git a/website/server/models/challenge.js b/website/server/models/challenge.js index b12cea1dd88..9901af0e793 100644 --- a/website/server/models/challenge.js +++ b/website/server/models/challenge.js @@ -19,7 +19,7 @@ let Schema = mongoose.Schema; let schema = new Schema({ name: {type: String, required: true}, - shortName: {type: String, required: true}, + shortName: {type: String, required: true, minlength: 3}, description: String, official: {type: Boolean, default: false}, tasksOrder: { diff --git a/website/views/options/social/challenges.jade b/website/views/options/social/challenges.jade index ac5c71fd4c2..ab84189f6f6 100644 --- a/website/views/options/social/challenges.jade +++ b/website/views/options/social/challenges.jade @@ -145,7 +145,7 @@ script(type='text/ng-template', id='partials/options.social.challenges.html') .row .form-group.col-md-6.col-sm-12 - input.form-control(type='text', minlength="3", + input.form-control(type='text', ng-model='newChallenge.shortName', placeholder=env.t('challengeTag'), required ng-disabled='insufficientGemsForTavernChallenge()') |