2019-01-17 08:16:45 -08:00
import { defaultState , mutations , prepareStatus } from '../../../../src/modules/statuses.js'
2016-11-07 09:05:04 -08:00
2017-03-08 08:58:49 -08:00
// eslint-disable-next-line camelcase
2019-07-05 00:02:14 -07:00
const makeMockStatus = ( { id , text , type = 'status' } ) => {
2016-11-07 09:05:04 -08:00
return {
id ,
2019-07-05 00:02:14 -07:00
user : { id : '0' } ,
2016-11-07 09:05:04 -08:00
name : 'status' ,
2016-11-07 09:36:11 -08:00
text : text || ` Text number ${ id } ` ,
2016-11-07 09:05:04 -08:00
fave _num : 0 ,
2016-11-18 10:48:02 -08:00
uri : '' ,
2019-01-15 07:39:24 -08:00
type ,
2016-11-27 10:11:05 -08:00
attentions : [ ]
2016-11-07 09:05:04 -08:00
}
}
2019-03-10 13:40:48 -07:00
describe ( 'Statuses module' , ( ) => {
describe ( 'prepareStatus' , ( ) => {
it ( 'sets deleted flag to false' , ( ) => {
2019-07-05 00:02:14 -07:00
const aStatus = makeMockStatus ( { id : '1' , text : 'Hello oniichan' } )
2019-03-10 13:40:48 -07:00
expect ( prepareStatus ( aStatus ) . deleted ) . to . eq ( false )
} )
2016-12-04 09:30:00 -08:00
} )
2016-11-13 13:40:33 -08:00
2019-03-10 13:40:48 -07:00
describe ( 'addNewStatuses' , ( ) => {
it ( 'adds the status to allStatuses and to the given timeline' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
2016-11-07 09:05:04 -08:00
2019-03-10 13:40:48 -07:00
mutations . addNewStatuses ( state , { statuses : [ status ] , timeline : 'public' } )
2016-11-07 09:05:04 -08:00
2019-03-10 13:40:48 -07:00
expect ( state . allStatuses ) . to . eql ( [ status ] )
expect ( state . timelines . public . statuses ) . to . eql ( [ status ] )
expect ( state . timelines . public . visibleStatuses ) . to . eql ( [ ] )
expect ( state . timelines . public . newStatusCount ) . to . equal ( 1 )
} )
2016-11-07 09:05:04 -08:00
2019-03-10 13:40:48 -07:00
it ( 'counts the status as new if it has not been seen on this timeline' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
2017-02-16 03:51:24 -08:00
2019-03-10 13:40:48 -07:00
mutations . addNewStatuses ( state , { statuses : [ status ] , timeline : 'public' } )
mutations . addNewStatuses ( state , { statuses : [ status ] , timeline : 'friends' } )
2017-02-16 03:51:24 -08:00
2019-03-10 13:40:48 -07:00
expect ( state . allStatuses ) . to . eql ( [ status ] )
expect ( state . timelines . public . statuses ) . to . eql ( [ status ] )
expect ( state . timelines . public . visibleStatuses ) . to . eql ( [ ] )
expect ( state . timelines . public . newStatusCount ) . to . equal ( 1 )
2017-02-16 03:51:24 -08:00
2019-03-10 13:40:48 -07:00
expect ( state . allStatuses ) . to . eql ( [ status ] )
expect ( state . timelines . friends . statuses ) . to . eql ( [ status ] )
expect ( state . timelines . friends . visibleStatuses ) . to . eql ( [ ] )
expect ( state . timelines . friends . newStatusCount ) . to . equal ( 1 )
} )
2017-02-16 03:51:24 -08:00
2019-03-10 13:40:48 -07:00
it ( 'add the statuses to allStatuses if no timeline is given' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
2016-11-24 09:15:34 -08:00
2019-03-10 13:40:48 -07:00
mutations . addNewStatuses ( state , { statuses : [ status ] } )
2016-11-24 09:15:34 -08:00
2019-03-10 13:40:48 -07:00
expect ( state . allStatuses ) . to . eql ( [ status ] )
expect ( state . timelines . public . statuses ) . to . eql ( [ ] )
expect ( state . timelines . public . visibleStatuses ) . to . eql ( [ ] )
expect ( state . timelines . public . newStatusCount ) . to . equal ( 0 )
} )
2016-11-24 09:15:34 -08:00
2019-03-10 13:40:48 -07:00
it ( 'adds the status to allStatuses and to the given timeline, directly visible' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
2016-11-07 09:05:04 -08:00
2019-03-10 13:40:48 -07:00
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
2016-11-07 09:05:04 -08:00
2019-03-10 13:40:48 -07:00
expect ( state . allStatuses ) . to . eql ( [ status ] )
expect ( state . timelines . public . statuses ) . to . eql ( [ status ] )
expect ( state . timelines . public . visibleStatuses ) . to . eql ( [ status ] )
expect ( state . timelines . public . newStatusCount ) . to . equal ( 0 )
} )
2016-11-18 10:48:02 -08:00
2019-03-10 13:40:48 -07:00
it ( 'removes statuses by tag on deletion' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
const otherStatus = makeMockStatus ( { id : '3' } )
2019-03-10 13:40:48 -07:00
status . uri = 'xxx'
2019-07-05 00:02:14 -07:00
const deletion = makeMockStatus ( { id : '2' , type : 'deletion' } )
2019-03-10 13:40:48 -07:00
deletion . text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.'
deletion . uri = 'xxx'
2016-11-18 13:25:42 -08:00
2019-03-10 13:40:48 -07:00
mutations . addNewStatuses ( state , { statuses : [ status , otherStatus ] , showImmediately : true , timeline : 'public' } )
mutations . addNewStatuses ( state , { statuses : [ deletion ] , showImmediately : true , timeline : 'public' } )
2016-11-28 12:25:36 -08:00
2019-03-10 13:40:48 -07:00
expect ( state . allStatuses ) . to . eql ( [ otherStatus ] )
expect ( state . timelines . public . statuses ) . to . eql ( [ otherStatus ] )
expect ( state . timelines . public . visibleStatuses ) . to . eql ( [ otherStatus ] )
expect ( state . timelines . public . maxId ) . to . eql ( '3' )
} )
2016-11-28 12:25:36 -08:00
2019-03-10 13:40:48 -07:00
it ( 'does not update the maxId when the noIdUpdate flag is set' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
const secondStatus = makeMockStatus ( { id : '2' } )
2016-11-28 12:25:36 -08:00
2019-03-10 13:40:48 -07:00
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
expect ( state . timelines . public . maxId ) . to . eql ( '1' )
2017-01-01 09:10:25 -08:00
2019-03-10 13:40:48 -07:00
mutations . addNewStatuses ( state , { statuses : [ secondStatus ] , showImmediately : true , timeline : 'public' , noIdUpdate : true } )
expect ( state . timelines . public . statuses ) . to . eql ( [ secondStatus , status ] )
expect ( state . timelines . public . visibleStatuses ) . to . eql ( [ secondStatus , status ] )
expect ( state . timelines . public . maxId ) . to . eql ( '1' )
} )
2016-11-18 10:48:02 -08:00
2019-03-10 13:40:48 -07:00
it ( 'keeps a descending by id order in timeline.visibleStatuses and timeline.statuses' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const nonVisibleStatus = makeMockStatus ( { id : '1' } )
const status = makeMockStatus ( { id : '3' } )
const statusTwo = makeMockStatus ( { id : '2' } )
const statusThree = makeMockStatus ( { id : '4' } )
2016-11-18 10:48:02 -08:00
2019-03-10 13:40:48 -07:00
mutations . addNewStatuses ( state , { statuses : [ nonVisibleStatus ] , showImmediately : false , timeline : 'public' } )
2016-11-18 10:48:02 -08:00
2019-03-10 13:40:48 -07:00
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
mutations . addNewStatuses ( state , { statuses : [ statusTwo ] , showImmediately : true , timeline : 'public' } )
2016-11-18 10:48:02 -08:00
2019-03-10 13:40:48 -07:00
expect ( state . timelines . public . minVisibleId ) . to . equal ( '2' )
2016-11-07 09:05:04 -08:00
2019-03-10 13:40:48 -07:00
mutations . addNewStatuses ( state , { statuses : [ statusThree ] , showImmediately : true , timeline : 'public' } )
2016-11-07 09:36:11 -08:00
2019-03-10 13:40:48 -07:00
expect ( state . timelines . public . statuses ) . to . eql ( [ statusThree , status , statusTwo , nonVisibleStatus ] )
expect ( state . timelines . public . visibleStatuses ) . to . eql ( [ statusThree , status , statusTwo ] )
} )
it ( 'splits retweets from their status and links them' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
const retweet = makeMockStatus ( { id : '2' , type : 'retweet' } )
const modStatus = makeMockStatus ( { id : '1' , text : 'something else' } )
2019-03-10 13:40:48 -07:00
retweet . retweeted _status = status
// It adds both statuses, but only the retweet to visible.
mutations . addNewStatuses ( state , { statuses : [ retweet ] , timeline : 'public' , showImmediately : true } )
expect ( state . timelines . public . visibleStatuses ) . to . have . length ( 1 )
expect ( state . timelines . public . statuses ) . to . have . length ( 1 )
expect ( state . allStatuses ) . to . have . length ( 2 )
expect ( state . allStatuses [ 0 ] . id ) . to . equal ( '1' )
expect ( state . allStatuses [ 1 ] . id ) . to . equal ( '2' )
// It refers to the modified status.
mutations . addNewStatuses ( state , { statuses : [ modStatus ] , timeline : 'public' } )
expect ( state . allStatuses ) . to . have . length ( 2 )
expect ( state . allStatuses [ 0 ] . id ) . to . equal ( '1' )
expect ( state . allStatuses [ 0 ] . text ) . to . equal ( modStatus . text )
expect ( state . allStatuses [ 1 ] . id ) . to . equal ( '2' )
expect ( retweet . retweeted _status . text ) . to . eql ( modStatus . text )
} )
it ( 'replaces existing statuses with the same id' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
const modStatus = makeMockStatus ( { id : '1' , text : 'something else' } )
2016-11-07 09:05:04 -08:00
2019-03-10 13:40:48 -07:00
// Add original status
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
expect ( state . timelines . public . visibleStatuses ) . to . have . length ( 1 )
expect ( state . allStatuses ) . to . have . length ( 1 )
// Add new version of status
mutations . addNewStatuses ( state , { statuses : [ modStatus ] , showImmediately : true , timeline : 'public' } )
expect ( state . timelines . public . visibleStatuses ) . to . have . length ( 1 )
expect ( state . allStatuses ) . to . have . length ( 1 )
expect ( state . allStatuses [ 0 ] . text ) . to . eql ( modStatus . text )
} )
it ( 'replaces existing statuses with the same id, coming from a retweet' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
const modStatus = makeMockStatus ( { id : '1' , text : 'something else' } )
const retweet = makeMockStatus ( { id : '2' , type : 'retweet' } )
2019-03-10 13:40:48 -07:00
retweet . retweeted _status = modStatus
// Add original status
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
expect ( state . timelines . public . visibleStatuses ) . to . have . length ( 1 )
expect ( state . allStatuses ) . to . have . length ( 1 )
// Add new version of status
mutations . addNewStatuses ( state , { statuses : [ retweet ] , showImmediately : false , timeline : 'public' } )
expect ( state . timelines . public . visibleStatuses ) . to . have . length ( 1 )
// Don't add the retweet itself if the tweet is visible
expect ( state . timelines . public . statuses ) . to . have . length ( 1 )
expect ( state . allStatuses ) . to . have . length ( 2 )
expect ( state . allStatuses [ 0 ] . text ) . to . eql ( modStatus . text )
} )
it ( 'handles favorite actions' , ( ) => {
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
2019-03-10 13:40:48 -07:00
const favorite = {
id : '2' ,
type : 'favorite' ,
in _reply _to _status _id : '1' , // The API uses strings here...
uri : 'tag:shitposter.club,2016-08-21:fave:3895:note:773501:2016-08-21T16:52:15+00:00' ,
text : 'a favorited something by b' ,
user : { id : '99' }
}
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
mutations . addNewStatuses ( state , { statuses : [ favorite ] , showImmediately : true , timeline : 'public' } )
expect ( state . timelines . public . visibleStatuses . length ) . to . eql ( 1 )
expect ( state . timelines . public . visibleStatuses [ 0 ] . fave _num ) . to . eql ( 1 )
expect ( state . timelines . public . maxId ) . to . eq ( favorite . id )
// Adding it again does nothing
mutations . addNewStatuses ( state , { statuses : [ favorite ] , showImmediately : true , timeline : 'public' } )
expect ( state . timelines . public . visibleStatuses . length ) . to . eql ( 1 )
expect ( state . timelines . public . visibleStatuses [ 0 ] . fave _num ) . to . eql ( 1 )
expect ( state . timelines . public . maxId ) . to . eq ( favorite . id )
// If something is favorited by the current user, it also sets the 'favorited' property but does not increment counter to avoid over-counting. Counter is incremented (updated, really) via response to the favorite request.
const user = {
id : '1'
}
const ownFavorite = {
id : '3' ,
type : 'favorite' ,
in _reply _to _status _id : '1' , // The API uses strings here...
uri : 'tag:shitposter.club,2016-08-21:fave:3895:note:773501:2016-08-21T16:52:15+00:00' ,
text : 'a favorited something by b' ,
user
}
mutations . addNewStatuses ( state , { statuses : [ ownFavorite ] , showImmediately : true , timeline : 'public' , user } )
expect ( state . timelines . public . visibleStatuses . length ) . to . eql ( 1 )
expect ( state . timelines . public . visibleStatuses [ 0 ] . fave _num ) . to . eql ( 1 )
expect ( state . timelines . public . visibleStatuses [ 0 ] . favorited ) . to . eql ( true )
} )
2016-11-13 08:59:35 -08:00
} )
2020-01-26 05:45:12 -08:00
describe ( 'emojiReactions' , ( ) => {
it ( 'increments count in existing reaction' , ( ) => {
const state = defaultState ( )
const status = makeMockStatus ( { id : '1' } )
status . emoji _reactions = [ { emoji : '😂' , count : 1 , accounts : [ ] } ]
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
mutations . addOwnReaction ( state , { id : '1' , emoji : '😂' , currentUser : { id : 'me' } } )
expect ( state . allStatusesObject [ '1' ] . emoji _reactions [ 0 ] . count ) . to . eql ( 2 )
expect ( state . allStatusesObject [ '1' ] . emoji _reactions [ 0 ] . accounts [ 0 ] . id ) . to . eql ( 'me' )
} )
it ( 'adds a new reaction' , ( ) => {
const state = defaultState ( )
const status = makeMockStatus ( { id : '1' } )
status . emoji _reactions = [ ]
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
mutations . addOwnReaction ( state , { id : '1' , emoji : '😂' , currentUser : { id : 'me' } } )
expect ( state . allStatusesObject [ '1' ] . emoji _reactions [ 0 ] . count ) . to . eql ( 1 )
expect ( state . allStatusesObject [ '1' ] . emoji _reactions [ 0 ] . accounts [ 0 ] . id ) . to . eql ( 'me' )
} )
it ( 'decreases count in existing reaction' , ( ) => {
const state = defaultState ( )
const status = makeMockStatus ( { id : '1' } )
status . emoji _reactions = [ { emoji : '😂' , count : 2 , accounts : [ { id : 'me' } ] } ]
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
mutations . removeOwnReaction ( state , { id : '1' , emoji : '😂' , currentUser : { } } )
expect ( state . allStatusesObject [ '1' ] . emoji _reactions [ 0 ] . count ) . to . eql ( 1 )
expect ( state . allStatusesObject [ '1' ] . emoji _reactions [ 0 ] . accounts ) . to . eql ( [ ] )
} )
it ( 'removes a reaction' , ( ) => {
const state = defaultState ( )
const status = makeMockStatus ( { id : '1' } )
status . emoji _reactions = [ { emoji : '😂' , count : 1 , accounts : [ { id : 'me' } ] } ]
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
mutations . removeOwnReaction ( state , { id : '1' , emoji : '😂' , currentUser : { } } )
expect ( state . allStatusesObject [ '1' ] . emoji _reactions . length ) . to . eql ( 0 )
} )
} )
2019-03-10 13:40:48 -07:00
describe ( 'showNewStatuses' , ( ) => {
it ( 'resets the minId to the min of the visible statuses when adding new to visible statuses' , ( ) => {
const state = defaultState ( )
const status = makeMockStatus ( { id : '10' } )
mutations . addNewStatuses ( state , { statuses : [ status ] , showImmediately : true , timeline : 'public' } )
const newStatus = makeMockStatus ( { id : '20' } )
mutations . addNewStatuses ( state , { statuses : [ newStatus ] , showImmediately : false , timeline : 'public' } )
state . timelines . public . minId = '5'
mutations . showNewStatuses ( state , { timeline : 'public' } )
expect ( state . timelines . public . visibleStatuses . length ) . to . eql ( 2 )
expect ( state . timelines . public . minVisibleId ) . to . eql ( '10' )
expect ( state . timelines . public . minId ) . to . eql ( '10' )
} )
2016-11-07 09:05:04 -08:00
} )
2016-11-18 13:55:04 -08:00
2019-03-10 13:40:48 -07:00
describe ( 'clearTimeline' , ( ) => {
2019-07-02 12:07:18 -07:00
it ( 'keeps userId when clearing user timeline when excludeUserId param is true' , ( ) => {
2019-03-10 13:40:48 -07:00
const state = defaultState ( )
state . timelines . user . userId = 123
2019-01-28 10:15:00 -08:00
2019-07-02 12:07:18 -07:00
mutations . clearTimeline ( state , { timeline : 'user' , excludeUserId : true } )
2019-01-28 10:15:00 -08:00
2019-03-10 13:40:48 -07:00
expect ( state . timelines . user . userId ) . to . eql ( 123 )
} )
2019-01-28 10:15:00 -08:00
} )
2016-11-18 13:55:04 -08:00
describe ( 'notifications' , ( ) => {
2017-06-06 06:54:08 -07:00
it ( 'removes a notification when the notice gets removed' , ( ) => {
2019-01-10 16:38:23 -08:00
const user = { id : '1' }
2019-02-28 11:27:47 -08:00
const state = defaultState ( )
2019-07-05 00:02:14 -07:00
const status = makeMockStatus ( { id : '1' } )
const otherStatus = makeMockStatus ( { id : '3' } )
const mentionedStatus = makeMockStatus ( { id : '2' } )
2017-06-06 06:54:08 -07:00
mentionedStatus . attentions = [ user ]
mentionedStatus . uri = 'xxx'
2017-06-13 03:01:47 -07:00
otherStatus . attentions = [ user ]
2017-06-06 06:54:08 -07:00
2019-07-05 00:02:14 -07:00
const deletion = makeMockStatus ( { id : '4' , type : 'deletion' } )
2017-06-06 06:54:08 -07:00
deletion . text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.'
deletion . uri = 'xxx'
2017-06-13 03:01:47 -07:00
mutations . addNewStatuses ( state , { statuses : [ status , otherStatus ] , user } )
2018-08-16 04:46:05 -07:00
mutations . addNewNotifications (
state ,
{
notifications : [ {
2019-01-17 08:27:57 -08:00
from _profile : { id : '2' } ,
id : '998' ,
2019-01-15 07:39:24 -08:00
type : 'mention' ,
2018-08-16 04:46:05 -07:00
status : otherStatus ,
2019-01-15 07:39:24 -08:00
action : otherStatus ,
seen : false
2018-08-16 04:46:05 -07:00
} ]
} )
2017-06-06 06:54:08 -07:00
2018-08-12 04:14:34 -07:00
expect ( state . notifications . data . length ) . to . eql ( 1 )
2018-08-16 04:46:05 -07:00
mutations . addNewNotifications (
state ,
{
notifications : [ {
2019-01-17 08:27:57 -08:00
from _profile : { id : '2' } ,
id : '999' ,
2019-01-15 07:39:24 -08:00
type : 'mention' ,
2018-08-16 04:46:05 -07:00
status : mentionedStatus ,
2019-01-15 07:39:24 -08:00
action : mentionedStatus ,
seen : false
2018-08-16 04:46:05 -07:00
} ]
} )
2017-06-06 06:54:08 -07:00
mutations . addNewStatuses ( state , { statuses : [ mentionedStatus ] , user } )
2017-06-13 03:01:47 -07:00
expect ( state . allStatuses . length ) . to . eql ( 3 )
2018-08-12 04:14:34 -07:00
expect ( state . notifications . data . length ) . to . eql ( 2 )
expect ( state . notifications . data [ 1 ] . status ) . to . eql ( mentionedStatus )
expect ( state . notifications . data [ 1 ] . action ) . to . eql ( mentionedStatus )
expect ( state . notifications . data [ 1 ] . type ) . to . eql ( 'mention' )
2017-06-06 06:54:08 -07:00
mutations . addNewStatuses ( state , { statuses : [ deletion ] , user } )
2017-06-13 03:01:47 -07:00
expect ( state . allStatuses . length ) . to . eql ( 2 )
2018-08-12 04:14:34 -07:00
expect ( state . notifications . data . length ) . to . eql ( 1 )
2017-06-06 06:54:08 -07:00
} )
2016-11-18 13:55:04 -08:00
} )
2016-11-07 09:05:04 -08:00
} )