diff --git a/test/spec/services/memberServicesSpec.js b/test/spec/services/memberServicesSpec.js index 0689cab3c3..d33ccd8c98 100644 --- a/test/spec/services/memberServicesSpec.js +++ b/test/spec/services/memberServicesSpec.js @@ -8,30 +8,59 @@ describe('memberServices', function() { members = Members; })); + afterEach(function() { + $httpBackend.verifyNoOutstandingExpectation(); + $httpBackend.verifyNoOutstandingRequest(); + }); + + it('has no members at the beginning', function() { expect(members.members).to.be.an('object'); expect(members.members).to.eql({}); expect(members.selectedMember).to.be.undefined; }); - it('populates members', function(){ - var uid = 'abc'; - members.populate({ - members: [{ _id: uid }] - }); - expect(members.members).to.eql({ - abc: { _id: uid } + describe('addToMembersList', function() { + it('adds member to members object', function() { + var member = { _id: 'user_id' }; + members.addToMembersList(member); + expect(members.members).to.eql({ + user_id: { _id: 'user_id' } + }); }); }); - it('selects a member', function(){ - var uid = 'abc'; - $httpBackend.expectGET('/api/v2/members/' + uid).respond({ _id: uid }); - members.selectMember(uid, function(){}); - $httpBackend.flush(); + describe('selectMember', function() { + it('fetches member if not already in cache', function() { + var uid = 'abc'; + $httpBackend.expectGET('/api/v2/members/' + uid).respond({ _id: uid }); + members.selectMember(uid, function(){}); + $httpBackend.flush(); - expect(members.selectedMember._id).to.eql(uid); - expect(members.members).to.have.property(uid); + expect(members.selectedMember._id).to.eql(uid); + expect(members.members).to.have.property(uid); + }); + + it('fetches member if member data in cache is incomplete', function() { + var uid = 'abc'; + members.members = { + abc: { _id: 'abc', items: {} } + } + $httpBackend.expectGET('/api/v2/members/' + uid).respond({ _id: uid }); + members.selectMember(uid, function(){}); + $httpBackend.flush(); + + expect(members.selectedMember._id).to.eql(uid); + expect(members.members).to.have.property(uid); + }); + + it('gets member from cache if member has a weapons object', function() { + var uid = 'abc'; + members.members[uid] = { _id: uid, items: { weapon: {} } }; + members.selectMember(uid, function(){ + expect(members.selectedMember._id).to.eql(uid); + expect(members.members).to.have.property(uid); + }); + }); }); - }); diff --git a/website/public/js/services/memberServices.js b/website/public/js/services/memberServices.js index 53a1c1e998..082fe27bbb 100644 --- a/website/public/js/services/memberServices.js +++ b/website/public/js/services/memberServices.js @@ -1,87 +1,60 @@ 'use strict'; +(function(){ + angular + .module('habitrpg') + .factory('Members', membersFactory); -/** - * Services that persists and retrieves user from localStorage. - */ + membersFactory.$inject = [ + '$rootScope', + 'Shared', + 'ApiUrl', + '$resource' + ]; -angular.module('habitrpg').factory('Members', -['$rootScope', 'Shared', 'ApiUrl', '$resource', -function($rootScope, Shared, ApiUrl, $resource) { - var members = {}; - var Member = $resource(ApiUrl.get() + '/api/v2/members/:uid', {uid:'@_id'}); - var memberServices = { + function membersFactory($rootScope, Shared, ApiUrl, $resource) { + var members = {}; + var fetchMember = $resource(ApiUrl.get() + '/api/v2/members/:uid', { uid: '@_id' }).get; - Member: Member, + function selectMember(uid, cb) { - members: members, - - /** - * Allows us to lazy-load party / group / public members throughout the application. - * @param obj - either a group or an individual member. If it's a group, we lazy-load all of its members. - */ - populate: function(obj){ - - function populateGroup(group){ - _.each(group.members, function(member){ - // meaning `populate('members')` wasn't run on the server, so we're getting the "in-database" form of - // the members array, which is just a list of IDs - not the populated objects - if (_.isString(member)) return; - - // lazy-load - members[member._id] = member; - }) - } - - // Array of groups - if (_.isArray(obj)) { - if (obj[0] && obj[0].members) { - _.each(obj, function(group){ - populateGroup(group); - }) - } - - // Individual Group - } else if (obj.members) - populateGroup(obj); - - // individual Member - if (obj._id) { - members[obj._id] = obj; - } - }, - - selectedMember: undefined, - - /** - * Once users are populated, we fetch them throughout the application (eg, modals). This - * either gets them or fetches if not available - * @param uid - */ - selectMember: function(uid, cb) { var self = this; - // Fetch from cache if we can. For guild members, only their uname will have been fetched on initial load, - // check if they have full fields (eg, check profile.items and an item inside - // because sometimes profile.items exists but it's empty like when user is fetched for party - // and then for guild) - // and if not, fetch them - if (members[uid] && members[uid].items && members[uid].items.weapon) { - Shared.wrap(members[uid],false); - self.selectedMember = members[uid]; - cb(); + var memberIsReady = _checkIfMemberIsReady(members[uid]); + + if (memberIsReady) { + _prepareMember(self, members[uid], cb); } else { - Member.get({uid: uid}, function(member){ - self.populate(member); // lazy load for later - Shared.wrap(member,false); - self.selectedMember = members[member._id]; - cb(); + fetchMember({ uid: uid }, function(member) { + addToMembersList(member); // lazy load for later + _prepareMember(self, member, cb); }); } } + + function addToMembersList(member){ + if (member._id) { + members[member._id] = member; + } + } + + function _checkIfMemberIsReady(member) { + return member && member.items && member.items.weapon; + } + + function _prepareMember(self, member, cb) { + Shared.wrap(member, false); + self.selectedMember = members[member._id]; + cb(); + } + + $rootScope.$on('userUpdated', function(event, user){ + populate(user); + }) + + return { + members: members, + addToMembersList: addToMembersList, + selectedMember: undefined, + selectMember: selectMember + } } - - $rootScope.$on('userUpdated', function(event, user){ - memberServices.populate(user); - }) - - return memberServices; -}]); +}()); diff --git a/website/public/js/services/questServices.js b/website/public/js/services/questServices.js index 1ca6995c38..6623d425b1 100644 --- a/website/public/js/services/questServices.js +++ b/website/public/js/services/questServices.js @@ -1,6 +1,5 @@ -/** - * Created by Sabe on 7/7/2015. - */ +'use strict'; + (function(){ angular .module('habitrpg')