Merge branch 'hotfix/21.56.9' into master
[gitter.git] / modules / rooms / test / recent-room-service-test.js
blobb276faf5c3fc2fe83bf478a478c03f1e2f85b26d
1 /*jslint node:true, unused:true*/
2 /*global describe:true, it:true */
3 'use strict';
5 var assert = require('assert');
6 var fixtureLoader = require('gitter-web-test-utils/lib/test-fixtures');
8 var recentRoomService = require('../lib/recent-room-service');
9 var recentRoomCore = require('../lib/recent-room-core');
10 const roomFavouritesCore = require('../lib/room-favourites-core');
11 var persistenceService = require('gitter-web-persistence');
13 describe('recent-room-service', function() {
14   describe('ordering', function() {
15     var fixture = fixtureLoader.setup({
16       user1: {},
17       userNoTroupes: {},
18       troupe1: { users: ['user1'] },
19       troupe2: { users: ['user1'] },
20       troupe3: { users: ['user1'] },
21       troupe4: { users: ['user1'] }
22     });
24     it('should rearrange the order of favourites correctly', function() {
25       this.timeout(10000);
27       function getFavs() {
28         return roomFavouritesCore.findFavouriteTroupesForUser(fixture.user1.id);
29       }
31       return recentRoomService
32         .updateFavourite(fixture.user1.id, fixture.troupe1.id, 1)
33         .then(getFavs)
34         .then(function(favs) {
35           assert.equal(favs[fixture.troupe1.id], 1);
36         })
37         .then(function() {
38           return recentRoomService.updateFavourite(fixture.user1.id, fixture.troupe2.id, 1);
39         })
40         .then(getFavs)
41         .then(function(favs) {
42           assert.equal(favs[fixture.troupe1.id], 2);
43           assert.equal(favs[fixture.troupe2.id], 1);
44         })
45         .then(function() {
46           return recentRoomService.updateFavourite(fixture.user1.id, fixture.troupe2.id, 3);
47         })
48         .then(getFavs)
49         .then(function(favs) {
50           assert.equal(favs[fixture.troupe1.id], 2);
51           assert.equal(favs[fixture.troupe2.id], 3);
52         })
53         .then(function() {
54           return recentRoomService.updateFavourite(fixture.user1.id, fixture.troupe3.id, 1);
55         })
56         .then(getFavs)
57         .then(function(favs) {
58           assert.equal(favs[fixture.troupe3.id], 1);
59           assert.equal(favs[fixture.troupe1.id], 2);
60           assert.equal(favs[fixture.troupe2.id], 3);
61         })
62         .then(function() {
63           return recentRoomService.updateFavourite(fixture.user1.id, fixture.troupe2.id, 2);
64         })
65         .then(getFavs)
66         .then(function(favs) {
67           assert.equal(favs[fixture.troupe3.id], 1);
68           assert.equal(favs[fixture.troupe2.id], 2);
69           assert.equal(favs[fixture.troupe1.id], 3);
70         })
71         .then(function() {
72           return recentRoomService.updateFavourite(fixture.user1.id, fixture.troupe1.id, 4);
73         })
74         .then(getFavs)
75         .then(function(favs) {
76           assert.equal(favs[fixture.troupe3.id], 1);
77           assert.equal(favs[fixture.troupe2.id], 2);
78           assert.equal(favs[fixture.troupe1.id], 4);
79         })
80         .then(function() {
81           return recentRoomService.updateFavourite(fixture.user1.id, fixture.troupe4.id, 1);
82         })
83         .then(getFavs)
84         .then(function(favs) {
85           assert.equal(favs[fixture.troupe4.id], 1);
86           assert.equal(favs[fixture.troupe3.id], 2);
87           assert.equal(favs[fixture.troupe2.id], 3);
88           assert.equal(favs[fixture.troupe1.id], 4);
89         });
90     });
91   });
93   describe('#updateFavourite()', function() {
94     var fixture = fixtureLoader.setup({
95       user1: {},
96       troupe1: { users: ['user1'] }
97     });
99     it('should add a troupe to favourites', function() {
100       function fav(val) {
101         return recentRoomService
102           .updateFavourite(fixture.user1.id, fixture.troupe1.id, val)
103           .then(function() {
104             return roomFavouritesCore.findFavouriteTroupesForUser(fixture.user1.id);
105           })
106           .then(function(favs) {
107             var isInTroupe = !!favs[fixture.troupe1.id];
108             assert(isInTroupe === val, 'Troupe should ' + (val ? '' : 'not ') + 'be a favourite');
109           });
110       }
112       return fav(true)
113         .then(() => fav(true))
114         .then(() => fav(false))
115         .then(() => fav(true));
116     });
117   });
119   describe('#saveLastVisitedTroupeforUserId', function() {
120     var fixture = fixtureLoader.setup({
121       user1: {},
122       troupe1: { users: ['user1'] }
123     });
125     it('should record the time each troupe was last accessed by a user', function() {
126       return recentRoomService
127         .saveLastVisitedTroupeforUserId(fixture.user1.id, fixture.troupe1.id)
128         .then(function() {
129           return persistenceService.User.findById(fixture.user1.id).exec();
130         })
131         .then(function(user) {
132           assert.equal(user.lastTroupe, fixture.troupe1.id);
134           return recentRoomCore.getTroupeLastAccessTimesForUser(fixture.user1.id);
135         })
136         .then(function(times) {
137           var troupeId = '' + fixture.troupe1.id;
139           var after = times[troupeId];
140           assert(after, 'Expected a value for last access time');
142           return recentRoomService
143             .saveLastVisitedTroupeforUserId(fixture.user1.id, fixture.troupe1.id)
144             .then(function() {
145               return recentRoomCore.getTroupeLastAccessTimesForUser(fixture.user1.id);
146             })
147             .then(function(times) {
148               assert(
149                 times[troupeId] > after,
150                 'The last access time for this troupe has not changed. Before it was ' +
151                   after +
152                   ' now it is ' +
153                   times[troupeId]
154               );
155             });
156         });
157     });
158   });
160   describe('#findInitialRoomUrlForUser', function() {
161     var fixture = fixtureLoader.setup({
162       user1: {},
163       user2: {},
164       userNoTroupes: {},
165       troupe1: { users: ['user1'] },
166       troupeOneToOne: { oneToOne: true, users: ['user1', 'user2'] }
167     });
169     it('#01 should return null when a user has no troupes', function() {
170       return recentRoomService
171         .saveLastVisitedTroupeforUserId(fixture.userNoTroupes.id, fixture.troupe1.id)
172         .then(function() {
173           fixture.userNoTroupes.lastTroupe = fixture.troupe1.id;
174           return recentRoomService.findInitialRoomUrlForUser(fixture.userNoTroupes);
175         })
176         .then(function(url) {
177           assert(url === null, 'Expected the url to be null');
178         });
179     });
181     it('#02 should return return the users last troupe when they have one', function() {
182       return recentRoomService
183         .saveLastVisitedTroupeforUserId(fixture.user1.id, fixture.troupe1.id)
184         .then(function() {
185           return recentRoomService.findInitialRoomUrlForUser(fixture.user1);
186         })
187         .then(function(url) {
188           assert.strictEqual(url, '/' + fixture.troupe1.uri);
189         });
190     });
192     it('#03 should return the users something when the user has troupes, but no last troupe', function() {
193       return recentRoomService.findInitialRoomUrlForUser(fixture.user1).then(function(url) {
194         assert(url !== null, 'Expected the troupe not to be null');
195       });
196     });
198     it('#04 should return one to one rooms', function() {
199       return recentRoomService
200         .saveLastVisitedTroupeforUserId(fixture.user1.id, fixture.troupeOneToOne.id)
201         .then(function() {
202           return recentRoomService.findInitialRoomUrlForUser(fixture.user1);
203         })
204         .then(function(url) {
205           assert.strictEqual(url, '/' + fixture.user2.username);
206         });
207     });
208   });