mirror of
https://github.com/discourse/discourse.git
synced 2025-05-23 22:51:06 +08:00
Some tests for the user stream
This commit is contained in:
@ -8,6 +8,16 @@
|
|||||||
**/
|
**/
|
||||||
Discourse.User = Discourse.Model.extend({
|
Discourse.User = Discourse.Model.extend({
|
||||||
|
|
||||||
|
/**
|
||||||
|
The user's stream
|
||||||
|
|
||||||
|
@property stream
|
||||||
|
@type {Discourse.UserStream}
|
||||||
|
**/
|
||||||
|
stream: function() {
|
||||||
|
return Discourse.UserStream.create({ user: this });
|
||||||
|
}.property(),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Is this user a member of staff?
|
Is this user a member of staff?
|
||||||
|
|
||||||
@ -32,9 +42,9 @@ Discourse.User = Discourse.Model.extend({
|
|||||||
@property avatarSmall
|
@property avatarSmall
|
||||||
@type {String}
|
@type {String}
|
||||||
**/
|
**/
|
||||||
avatarSmall: (function() {
|
avatarSmall: function() {
|
||||||
return Discourse.Utilities.avatarUrl(this.get('username'), 'small', this.get('avatar_template'));
|
return Discourse.Utilities.avatarUrl(this.get('username'), 'small', this.get('avatar_template'));
|
||||||
}).property('username'),
|
}.property('username'),
|
||||||
|
|
||||||
searchContext: function() {
|
searchContext: function() {
|
||||||
return ({ type: 'user', id: this.get('username_lower'), user: this });
|
return ({ type: 'user', id: this.get('username_lower'), user: this });
|
||||||
@ -269,26 +279,6 @@ Discourse.User = Discourse.Model.extend({
|
|||||||
user.setProperties(json.user);
|
user.setProperties(json.user);
|
||||||
return user;
|
return user;
|
||||||
});
|
});
|
||||||
},
|
|
||||||
|
|
||||||
findStream: function(filter) {
|
|
||||||
|
|
||||||
// When filtering for replies, include mentions and quotes too
|
|
||||||
if (filter === Discourse.UserAction.TYPES.replies) {
|
|
||||||
filter = [Discourse.UserAction.TYPES.replies,
|
|
||||||
Discourse.UserAction.TYPES.mentions,
|
|
||||||
Discourse.UserAction.TYPES.quotes].join(",");
|
|
||||||
}
|
|
||||||
|
|
||||||
var stream = Discourse.UserStream.create({
|
|
||||||
itemsLoaded: 0,
|
|
||||||
content: [],
|
|
||||||
filter: filter,
|
|
||||||
user: this
|
|
||||||
});
|
|
||||||
|
|
||||||
stream.findItems();
|
|
||||||
return stream;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -7,38 +7,64 @@
|
|||||||
@module Discourse
|
@module Discourse
|
||||||
**/
|
**/
|
||||||
Discourse.UserStream = Discourse.Model.extend({
|
Discourse.UserStream = Discourse.Model.extend({
|
||||||
|
loaded: false,
|
||||||
|
|
||||||
filterChanged: function() {
|
init: function() {
|
||||||
this.setProperties({
|
this.setProperties({ itemsLoaded: 0, content: [] });
|
||||||
content: Em.A(),
|
},
|
||||||
itemsLoaded: 0
|
|
||||||
});
|
filterParam: function() {
|
||||||
this.findItems();
|
var filter = this.get('filter');
|
||||||
}.observes('filter'),
|
if (filter === Discourse.UserAction.TYPES.replies) {
|
||||||
|
return [Discourse.UserAction.TYPES.replies,
|
||||||
|
Discourse.UserAction.TYPES.mentions,
|
||||||
|
Discourse.UserAction.TYPES.quotes].join(",");
|
||||||
|
}
|
||||||
|
return filter;
|
||||||
|
}.property('filter'),
|
||||||
|
|
||||||
|
baseUrl: Discourse.computed.url('itemsLoaded', 'user.username_lower', '/user_actions.json?offset=%@&username=%@'),
|
||||||
|
|
||||||
|
filterBy: function(filter) {
|
||||||
|
if (this.get('loaded') && (this.get('filter') === filter)) { return Ember.RSVP.resolve(); }
|
||||||
|
this.set('filter', filter);
|
||||||
|
return this.findItems();
|
||||||
|
},
|
||||||
|
|
||||||
findItems: function() {
|
findItems: function() {
|
||||||
var userStream = this;
|
var userStream = this;
|
||||||
if(this.get("loading")) { return Ember.RSVP.reject(); }
|
if(this.get('loading')) { return Ember.RSVP.reject(); }
|
||||||
this.set("loading",true);
|
|
||||||
|
|
||||||
var url = Discourse.getURL("/user_actions.json?offset=") + this.get('itemsLoaded') + "&username=" + (this.get('user.username_lower'));
|
this.setProperties({
|
||||||
if (this.get('filter')) {
|
loading: true,
|
||||||
url += "&filter=" + (this.get('filter'));
|
itemsLoaded: 0,
|
||||||
|
content: []
|
||||||
|
});
|
||||||
|
|
||||||
|
var url = this.get('baseUrl');
|
||||||
|
if (this.get('filterParam')) {
|
||||||
|
url += "&filter=" + this.get('filterParam');
|
||||||
}
|
}
|
||||||
|
|
||||||
var stream = this;
|
var loadingFinished = function() {
|
||||||
|
userStream.set('loading', false);
|
||||||
|
};
|
||||||
|
|
||||||
return Discourse.ajax(url, {cache: 'false'}).then( function(result) {
|
return Discourse.ajax(url, {cache: 'false'}).then( function(result) {
|
||||||
userStream.set("loading",false);
|
|
||||||
if (result && result.user_actions) {
|
if (result && result.user_actions) {
|
||||||
var copy = Em.A();
|
var copy = Em.A();
|
||||||
_.each(result.user_actions,function(action) {
|
result.user_actions.forEach(function(action) {
|
||||||
copy.pushObject(Discourse.UserAction.create(action));
|
copy.pushObject(Discourse.UserAction.create(action));
|
||||||
});
|
});
|
||||||
copy = Discourse.UserAction.collapseStream(copy);
|
|
||||||
stream.get('content').pushObjects(copy);
|
userStream.get('content').pushObjects(Discourse.UserAction.collapseStream(copy));
|
||||||
stream.set('itemsLoaded', stream.get('itemsLoaded') + result.user_actions.length);
|
userStream.setProperties({
|
||||||
|
loaded: true,
|
||||||
|
itemsLoaded: userStream.get('itemsLoaded') + result.user_actions.length
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}, function(){ userStream.set("loading", false); });
|
loadingFinished();
|
||||||
|
}, loadingFinished);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -135,7 +135,11 @@ Discourse.UserIndexRoute = Discourse.UserActivityRoute.extend({
|
|||||||
**/
|
**/
|
||||||
Discourse.UserActivityStreamRoute = Discourse.Route.extend({
|
Discourse.UserActivityStreamRoute = Discourse.Route.extend({
|
||||||
model: function() {
|
model: function() {
|
||||||
return this.modelFor('user').findStream(this.get('userActionType'));
|
return this.modelFor('user').get('stream');
|
||||||
|
},
|
||||||
|
|
||||||
|
afterModel: function() {
|
||||||
|
return this.modelFor('user').get('stream').filterBy(this.get('userActionType'));
|
||||||
},
|
},
|
||||||
|
|
||||||
renderTemplate: function() {
|
renderTemplate: function() {
|
||||||
|
29
test/javascripts/models/user_stream_test.js
Normal file
29
test/javascripts/models/user_stream_test.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
module("Discourse.User");
|
||||||
|
|
||||||
|
test('basics', function(){
|
||||||
|
var user = Discourse.User.create({id: 1, username: 'eviltrout'});
|
||||||
|
var stream = user.get('stream');
|
||||||
|
present(stream, "a user has a stream by default");
|
||||||
|
equal(stream.get('user'), user, "the stream points back to the user");
|
||||||
|
|
||||||
|
equal(stream.get('itemsLoaded'), 0, "no items are loaded by default");
|
||||||
|
blank(stream.get('content'), "no content by default");
|
||||||
|
blank(stream.get('filter'), "no filter by default");
|
||||||
|
|
||||||
|
ok(!stream.get('loaded'), "the stream is not loaded by default");
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
test('filterParam', function() {
|
||||||
|
var user = Discourse.User.create({id: 1, username: 'eviltrout'});
|
||||||
|
var stream = user.get('stream');
|
||||||
|
|
||||||
|
blank(stream.get('filterParam'), "it's blank by default");
|
||||||
|
|
||||||
|
stream.set('filter', Discourse.UserAction.TYPES.likes_given);
|
||||||
|
equal(stream.get('filterParam'), Discourse.UserAction.TYPES.likes_given);
|
||||||
|
|
||||||
|
stream.set('filter', Discourse.UserAction.TYPES.replies);
|
||||||
|
equal(stream.get('filterParam'), '6,7,9');
|
||||||
|
|
||||||
|
});
|
19
test/javascripts/models/user_test.js
Normal file
19
test/javascripts/models/user_test.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
module("Discourse.User");
|
||||||
|
|
||||||
|
test('staff', function(){
|
||||||
|
var user = Discourse.User.create({id: 1, username: 'eviltrout'});
|
||||||
|
|
||||||
|
ok(!user.get('staff'), "user is not staff");
|
||||||
|
|
||||||
|
user.toggleProperty('moderator');
|
||||||
|
ok(user.get('staff'), "moderators are staff");
|
||||||
|
|
||||||
|
user.setProperties({moderator: false, admin: true});
|
||||||
|
ok(user.get('staff'), "admins are staff");
|
||||||
|
});
|
||||||
|
|
||||||
|
test('searchContext', function() {
|
||||||
|
var user = Discourse.User.create({id: 1, username: 'EvilTrout'});
|
||||||
|
|
||||||
|
deepEqual(user.get('searchContext'), {type: 'user', id: 'eviltrout', user: user}, "has a search context");
|
||||||
|
});
|
Reference in New Issue
Block a user