diff --git a/test/spec/challengesCtrlSpec.js b/test/spec/challengesCtrlSpec.js new file mode 100644 index 0000000000..3744f6b99a --- /dev/null +++ b/test/spec/challengesCtrlSpec.js @@ -0,0 +1,174 @@ +'use strict'; + +describe('Challenges Controller', function() { + var $rootScope, scope, user, ctrl, challenges, groups; + + beforeEach(function() { + module(function($provide) { + $provide.value('User', {}); + }); + + inject(function($rootScope, $controller, Challenges, Groups){ + user = specHelper.newUser(); + user._id = "unique-user-id"; + + scope = $rootScope.$new(); + + // Load RootCtrl to ensure shared behaviors are loaded + $controller('RootCtrl', {$scope: scope, User: {user: user}}); + + ctrl = $controller('ChallengesCtrl', {$scope: scope, User: {user: user}}); + + challenges = Challenges; + + groups = Groups; + }); + }); + + it('filters challenges', function() { + + //There are for types of challenges + + //You can be the owner and a member + var ownMem = new challenges.Challenge({ + name: 'test', + description: 'test', + habits: [], + dailys: [], + todos: [], + rewards: [], + leader: user._id, + group: "test", + timestamp: +(new Date), + members: [user], + official: false, + _isMember: true + }); + + //You can be the owner and not a member + var ownNotMem = new challenges.Challenge({ + name: 'test', + description: 'test', + habits: [], + dailys: [], + todos: [], + rewards: [], + leader: user._id, + group: "test", + timestamp: +(new Date), + members: [], + official: false, + _isMember: false + }); + + //You not be the owner and a member + var notOwnMem = new challenges.Challenge({ + name: 'test', + description: 'test', + habits: [], + dailys: [], + todos: [], + rewards: [], + leader: {_id:"test"}, + group: "test", + timestamp: +(new Date), + members: [user], + official: false, + _isMember: true + }); + + //You not be the owner and not a member + var notOwnNotMem = new challenges.Challenge({ + name: 'test', + description: 'test', + habits: [], + dailys: [], + todos: [], + rewards: [], + leader: {_id:"test"}, + group: "test", + timestamp: +(new Date), + members: [], + official: false, + _isMember: false + }); + + scope.search = { + group: _.transform(groups, function(m,g){m[g._id]=true;}) + }; + + //Filter: Membership - either and Owner - either + scope.search._isMember = undefined; + scope.search._isOwner = undefined; + expect( scope.filterChallenges(ownMem) ).to.eql(true); + expect( scope.filterChallenges(ownNotMem) ).to.eql(true); + expect( scope.filterChallenges(notOwnMem) ).to.eql(true); + expect( scope.filterChallenges(notOwnNotMem) ).to.eql(true); + + //Filter: Membership - either and Owner - true + scope.search._isMember = undefined; + scope.search._isOwner = true; + expect( scope.filterChallenges(ownMem) ).to.eql(true); + expect( scope.filterChallenges(ownNotMem) ).to.eql(true); + expect( scope.filterChallenges(notOwnMem) ).to.eql(false); + expect( scope.filterChallenges(notOwnNotMem) ).to.eql(false); + + //Filter: Membership - either and Owner - false + scope.search._isMember = undefined; + scope.search._isOwner = false; + expect( scope.filterChallenges(ownMem) ).to.eql(false); + expect( scope.filterChallenges(ownNotMem) ).to.eql(false); + expect( scope.filterChallenges(notOwnMem) ).to.eql(true); + expect( scope.filterChallenges(notOwnNotMem) ).to.eql(true); + + //Filter: Membership - true and Owner - either + scope.search._isMember = true; + scope.search._isOwner = undefined; + expect( scope.filterChallenges(ownMem) ).to.eql(true); + expect( scope.filterChallenges(ownNotMem) ).to.eql(false); + expect( scope.filterChallenges(notOwnMem) ).to.eql(true); + expect( scope.filterChallenges(notOwnNotMem) ).to.eql(false); + + //Filter: Membership - true and Owner - true + scope.search._isMember = true; + scope.search._isOwner = true; + expect( scope.filterChallenges(ownMem) ).to.eql(true); + expect( scope.filterChallenges(ownNotMem) ).to.eql(false); + expect( scope.filterChallenges(notOwnMem) ).to.eql(false); + expect( scope.filterChallenges(notOwnNotMem) ).to.eql(false); + + //Filter: Membership - true and Owner - false + scope.search._isMember = true; + scope.search._isOwner = false; + expect( scope.filterChallenges(ownMem) ).to.eql(false); + expect( scope.filterChallenges(ownNotMem) ).to.eql(false); + expect( scope.filterChallenges(notOwnMem) ).to.eql(true); + expect( scope.filterChallenges(notOwnNotMem) ).to.eql(false); + + //Filter: Membership - false and Owner - either + scope.search._isMember = false; + scope.search._isOwner = undefined; + expect( scope.filterChallenges(ownMem) ).to.eql(false); + expect( scope.filterChallenges(ownNotMem) ).to.eql(true); + expect( scope.filterChallenges(notOwnMem) ).to.eql(false); + expect( scope.filterChallenges(notOwnNotMem) ).to.eql(true); + + //Filter: Membership - false and Owner - true + scope.search._isMember = false; + scope.search._isOwner = true; + expect( scope.filterChallenges(ownMem) ).to.eql(false); + expect( scope.filterChallenges(ownNotMem) ).to.eql(true); + expect( scope.filterChallenges(notOwnMem) ).to.eql(false); + expect( scope.filterChallenges(notOwnNotMem) ).to.eql(false); + + //Filter: Membership - false and Owner - false + scope.search._isMember = false; + scope.search._isOwner = false; + expect( scope.filterChallenges(ownMem) ).to.eql(false); + expect( scope.filterChallenges(ownNotMem) ).to.eql(false); + expect( scope.filterChallenges(notOwnMem) ).to.eql(false); + expect( scope.filterChallenges(notOwnNotMem) ).to.eql(true); + + }); + +}); diff --git a/website/public/js/controllers/challengesCtrl.js b/website/public/js/controllers/challengesCtrl.js index 2deef7eb40..218977ca0f 100644 --- a/website/public/js/controllers/challengesCtrl.js +++ b/website/public/js/controllers/challengesCtrl.js @@ -259,18 +259,20 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', if (!$scope.search) return true; - //Filter challenges that are owned by the user - if ($scope.search._isOwner == true) { - return (chal.leader._id == User.user.id); - } else if ($scope.search._isOwner == false) { - return (chal.leader._id != User.user.id); - } else { - return ($scope.search.group[chal.group._id] && - (typeof $scope.search._isMember == 'undefined' || $scope.search._isMember == chal._isMember)); - } + //Currently, all filters are andded together + + //First we must filter by selected groups + var showChallenge = $scope.search.group[chal.group._id]; + + //Membership filters: Show if user has selected either or has selcted Owned and is owner + var userIsOwner = chal.leader._id == User.user.id; + showChallenge = showChallenge && (typeof $scope.search._isOwner === 'undefined' || userIsOwner === $scope.search._isOwner ); +console.log($scope.search._isMember, chal._isMember) + //Membership filters: Show if user has selected either or has selcted Participating and is a member + showChallenge = showChallenge && (typeof $scope.search._isMember === 'undefined' || $scope.search._isMember === chal._isMember); + + return showChallenge; - //By default we should return true to show all challenges - return true; } $scope.$watch('newChallenge.group', function(gid){