fix tests, removed one unused function, fix real problem that tests helped to

surface
This commit is contained in:
Henry Jameson 2019-01-11 03:38:23 +03:00
parent 48e811e6ed
commit b18e27c6d4
5 changed files with 62 additions and 81 deletions

View File

@ -100,10 +100,6 @@ export const statusType = (status) => {
return 'unknown' return 'unknown'
} }
export const findMaxId = (...args) => {
return (maxBy(flatten(args), 'id') || {}).id
}
const mergeOrAdd = (arr, obj, item) => { const mergeOrAdd = (arr, obj, item) => {
// For sequential IDs BE passes numbers as numbers, we want them as strings. // For sequential IDs BE passes numbers as numbers, we want them as strings.
item.id = String(item.id) item.id = String(item.id)

View File

@ -11,7 +11,7 @@ export const visibleTypes = store => ([
export const visibleNotificationsFromStore = store => { export const visibleNotificationsFromStore = store => {
// map is just to clone the array since sort mutates it and it causes some issues // map is just to clone the array since sort mutates it and it causes some issues
let sortedNotifications = notificationsFromStore(store).map(_ => _).sort((a, b) => a.id > b.id ? -1 : 1) let sortedNotifications = notificationsFromStore(store).map(_ => _).sort((a, b) => a.action.id > b.action.id ? -1 : 1)
sortedNotifications = sortBy(sortedNotifications, 'seen') sortedNotifications = sortBy(sortedNotifications, 'seen')
return sortedNotifications.filter((notification) => visibleTypes(store).includes(notification.type)) return sortedNotifications.filter((notification) => visibleTypes(store).includes(notification.type))
} }

View File

@ -1,11 +1,11 @@
import { cloneDeep } from 'lodash' import { cloneDeep } from 'lodash'
import { defaultState, mutations, findMaxId, prepareStatus, statusType } from '../../../../src/modules/statuses.js' import { defaultState, mutations, prepareStatus, statusType } from '../../../../src/modules/statuses.js'
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
const makeMockStatus = ({id, text, is_post_verb = true}) => { const makeMockStatus = ({id, text, is_post_verb = true}) => {
return { return {
id, id,
user: {id: 0}, user: {id: '0'},
name: 'status', name: 'status',
text: text || `Text number ${id}`, text: text || `Text number ${id}`,
fave_num: 0, fave_num: 0,
@ -32,45 +32,30 @@ describe('Statuses.statusType', () => {
describe('Statuses.prepareStatus', () => { describe('Statuses.prepareStatus', () => {
it('sets nsfw for statuses with the #nsfw tag', () => { it('sets nsfw for statuses with the #nsfw tag', () => {
const safe = makeMockStatus({id: 1, text: 'Hello oniichan'}) const safe = makeMockStatus({id: '1', text: 'Hello oniichan'})
const nsfw = makeMockStatus({id: 1, text: 'Hello oniichan #nsfw'}) const nsfw = makeMockStatus({id: '1', text: 'Hello oniichan #nsfw'})
expect(prepareStatus(safe).nsfw).to.eq(false) expect(prepareStatus(safe).nsfw).to.eq(false)
expect(prepareStatus(nsfw).nsfw).to.eq(true) expect(prepareStatus(nsfw).nsfw).to.eq(true)
}) })
it('leaves existing nsfw settings alone', () => { it('leaves existing nsfw settings alone', () => {
const nsfw = makeMockStatus({id: 1, text: 'Hello oniichan #nsfw'}) const nsfw = makeMockStatus({id: '1', text: 'Hello oniichan #nsfw'})
nsfw.nsfw = false nsfw.nsfw = false
expect(prepareStatus(nsfw).nsfw).to.eq(false) expect(prepareStatus(nsfw).nsfw).to.eq(false)
}) })
it('sets deleted flag to false', () => { it('sets deleted flag to false', () => {
const aStatus = makeMockStatus({id: 1, text: 'Hello oniichan'}) const aStatus = makeMockStatus({id: '1', text: 'Hello oniichan'})
expect(prepareStatus(aStatus).deleted).to.eq(false) expect(prepareStatus(aStatus).deleted).to.eq(false)
}) })
}) })
describe('Statuses.findMaxId', () => {
it('returns the largest id in any of the given arrays', () => {
const statusesOne = [{ id: 100 }, { id: 2 }]
const statusesTwo = [{ id: 3 }]
const maxId = findMaxId(statusesOne, statusesTwo)
expect(maxId).to.eq(100)
})
it('returns undefined for empty arrays', () => {
const maxId = findMaxId([], [])
expect(maxId).to.eq(undefined)
})
})
describe('The Statuses module', () => { describe('The Statuses module', () => {
it('adds the status to allStatuses and to the given timeline', () => { it('adds the status to allStatuses and to the given timeline', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' })
@ -82,7 +67,7 @@ describe('The Statuses module', () => {
it('counts the status as new if it has not been seen on this timeline', () => { it('counts the status as new if it has not been seen on this timeline', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], timeline: 'public' })
mutations.addNewStatuses(state, { statuses: [status], timeline: 'friends' }) mutations.addNewStatuses(state, { statuses: [status], timeline: 'friends' })
@ -100,7 +85,7 @@ describe('The Statuses module', () => {
it('add the statuses to allStatuses if no timeline is given', () => { it('add the statuses to allStatuses if no timeline is given', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
mutations.addNewStatuses(state, { statuses: [status] }) mutations.addNewStatuses(state, { statuses: [status] })
@ -112,7 +97,7 @@ describe('The Statuses module', () => {
it('adds the status to allStatuses and to the given timeline, directly visible', () => { it('adds the status to allStatuses and to the given timeline, directly visible', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
@ -124,10 +109,10 @@ describe('The Statuses module', () => {
it('removes statuses by tag on deletion', () => { it('removes statuses by tag on deletion', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
const otherStatus = makeMockStatus({id: 3}) const otherStatus = makeMockStatus({id: '3'})
status.uri = 'xxx' status.uri = 'xxx'
const deletion = makeMockStatus({id: 2, is_post_verb: false}) const deletion = makeMockStatus({id: '2', is_post_verb: false})
deletion.text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.' deletion.text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.'
deletion.uri = 'xxx' deletion.uri = 'xxx'
@ -137,36 +122,36 @@ describe('The Statuses module', () => {
expect(state.allStatuses).to.eql([otherStatus]) expect(state.allStatuses).to.eql([otherStatus])
expect(state.timelines.public.statuses).to.eql([otherStatus]) expect(state.timelines.public.statuses).to.eql([otherStatus])
expect(state.timelines.public.visibleStatuses).to.eql([otherStatus]) expect(state.timelines.public.visibleStatuses).to.eql([otherStatus])
expect(state.timelines.public.maxId).to.eql(3) expect(state.timelines.public.maxId).to.eql('3')
}) })
it('does not update the maxId when the noIdUpdate flag is set', () => { it('does not update the maxId when the noIdUpdate flag is set', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
const secondStatus = makeMockStatus({id: 2}) const secondStatus = makeMockStatus({id: '2'})
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
expect(state.timelines.public.maxId).to.eql(1) expect(state.timelines.public.maxId).to.eql('1')
mutations.addNewStatuses(state, { statuses: [secondStatus], showImmediately: true, timeline: 'public', noIdUpdate: true }) mutations.addNewStatuses(state, { statuses: [secondStatus], showImmediately: true, timeline: 'public', noIdUpdate: true })
expect(state.timelines.public.statuses).to.eql([secondStatus, status]) expect(state.timelines.public.statuses).to.eql([secondStatus, status])
expect(state.timelines.public.visibleStatuses).to.eql([secondStatus, status]) expect(state.timelines.public.visibleStatuses).to.eql([secondStatus, status])
expect(state.timelines.public.maxId).to.eql(1) expect(state.timelines.public.maxId).to.eql('1')
}) })
it('keeps a descending by id order in timeline.visibleStatuses and timeline.statuses', () => { it('keeps a descending by id order in timeline.visibleStatuses and timeline.statuses', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const nonVisibleStatus = makeMockStatus({id: 1}) const nonVisibleStatus = makeMockStatus({id: '1'})
const status = makeMockStatus({id: 3}) const status = makeMockStatus({id: '3'})
const statusTwo = makeMockStatus({id: 2}) const statusTwo = makeMockStatus({id: '2'})
const statusThree = makeMockStatus({id: 4}) const statusThree = makeMockStatus({id: '4'})
mutations.addNewStatuses(state, { statuses: [nonVisibleStatus], showImmediately: false, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [nonVisibleStatus], showImmediately: false, timeline: 'public' })
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
mutations.addNewStatuses(state, { statuses: [statusTwo], showImmediately: true, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [statusTwo], showImmediately: true, timeline: 'public' })
expect(state.timelines.public.minVisibleId).to.equal(2) expect(state.timelines.public.minVisibleId).to.equal('2')
mutations.addNewStatuses(state, { statuses: [statusThree], showImmediately: true, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [statusThree], showImmediately: true, timeline: 'public' })
@ -176,9 +161,9 @@ describe('The Statuses module', () => {
it('splits retweets from their status and links them', () => { it('splits retweets from their status and links them', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
const retweet = makeMockStatus({id: 2, is_post_verb: false}) const retweet = makeMockStatus({id: '2', is_post_verb: false})
const modStatus = makeMockStatus({id: 1, text: 'something else'}) const modStatus = makeMockStatus({id: '1', text: 'something else'})
retweet.retweeted_status = status retweet.retweeted_status = status
@ -187,22 +172,22 @@ describe('The Statuses module', () => {
expect(state.timelines.public.visibleStatuses).to.have.length(1) expect(state.timelines.public.visibleStatuses).to.have.length(1)
expect(state.timelines.public.statuses).to.have.length(1) expect(state.timelines.public.statuses).to.have.length(1)
expect(state.allStatuses).to.have.length(2) expect(state.allStatuses).to.have.length(2)
expect(state.allStatuses[0].id).to.equal(1) expect(state.allStatuses[0].id).to.equal('1')
expect(state.allStatuses[1].id).to.equal(2) expect(state.allStatuses[1].id).to.equal('2')
// It refers to the modified status. // It refers to the modified status.
mutations.addNewStatuses(state, { statuses: [modStatus], timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [modStatus], timeline: 'public' })
expect(state.allStatuses).to.have.length(2) expect(state.allStatuses).to.have.length(2)
expect(state.allStatuses[0].id).to.equal(1) expect(state.allStatuses[0].id).to.equal('1')
expect(state.allStatuses[0].text).to.equal(modStatus.text) expect(state.allStatuses[0].text).to.equal(modStatus.text)
expect(state.allStatuses[1].id).to.equal(2) expect(state.allStatuses[1].id).to.equal('2')
expect(retweet.retweeted_status.text).to.eql(modStatus.text) expect(retweet.retweeted_status.text).to.eql(modStatus.text)
}) })
it('replaces existing statuses with the same id', () => { it('replaces existing statuses with the same id', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
const modStatus = makeMockStatus({id: 1, text: 'something else'}) const modStatus = makeMockStatus({id: '1', text: 'something else'})
// Add original status // Add original status
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
@ -218,9 +203,9 @@ describe('The Statuses module', () => {
it('replaces existing statuses with the same id, coming from a retweet', () => { it('replaces existing statuses with the same id, coming from a retweet', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
const modStatus = makeMockStatus({id: 1, text: 'something else'}) const modStatus = makeMockStatus({id: '1', text: 'something else'})
const retweet = makeMockStatus({id: 2, is_post_verb: false}) const retweet = makeMockStatus({id: '2', is_post_verb: false})
retweet.retweeted_status = modStatus retweet.retweeted_status = modStatus
// Add original status // Add original status
@ -239,15 +224,15 @@ describe('The Statuses module', () => {
it('handles favorite actions', () => { it('handles favorite actions', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
const favorite = { const favorite = {
id: 2, id: '2',
is_post_verb: false, is_post_verb: false,
in_reply_to_status_id: '1', // The API uses strings here... 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', uri: 'tag:shitposter.club,2016-08-21:fave:3895:note:773501:2016-08-21T16:52:15+00:00',
text: 'a favorited something by b', text: 'a favorited something by b',
user: { id: 99 } user: { id: '99' }
} }
mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' }) mutations.addNewStatuses(state, { statuses: [status], showImmediately: true, timeline: 'public' })
@ -266,11 +251,11 @@ describe('The Statuses module', () => {
// 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. // 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 = { const user = {
id: 1 id: '1'
} }
const ownFavorite = { const ownFavorite = {
id: 3, id: '3',
is_post_verb: false, is_post_verb: false,
in_reply_to_status_id: '1', // The API uses strings here... 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', uri: 'tag:shitposter.club,2016-08-21:fave:3895:note:773501:2016-08-21T16:52:15+00:00',
@ -287,16 +272,16 @@ describe('The Statuses module', () => {
describe('notifications', () => { describe('notifications', () => {
it('removes a notification when the notice gets removed', () => { it('removes a notification when the notice gets removed', () => {
const user = { id: 1 } const user = { id: '1' }
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const status = makeMockStatus({id: 1}) const status = makeMockStatus({id: '1'})
const otherStatus = makeMockStatus({id: 3}) const otherStatus = makeMockStatus({id: '3'})
const mentionedStatus = makeMockStatus({id: 2}) const mentionedStatus = makeMockStatus({id: '2'})
mentionedStatus.attentions = [user] mentionedStatus.attentions = [user]
mentionedStatus.uri = 'xxx' mentionedStatus.uri = 'xxx'
otherStatus.attentions = [user] otherStatus.attentions = [user]
const deletion = makeMockStatus({id: 4, is_post_verb: false}) const deletion = makeMockStatus({id: '4', is_post_verb: false})
deletion.text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.' deletion.text = 'Dolus deleted notice {{tag:gs.smuglo.li,2016-11-18:noticeId=1038007:objectType=note}}.'
deletion.uri = 'xxx' deletion.uri = 'xxx'

View File

@ -6,8 +6,8 @@ describe('The users module', () => {
describe('mutations', () => { describe('mutations', () => {
it('adds new users to the set, merging in new information for old users', () => { it('adds new users to the set, merging in new information for old users', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const user = { id: 1, name: 'Guy' } const user = { id: '1', name: 'Guy' }
const modUser = { id: 1, name: 'Dude' } const modUser = { id: '1', name: 'Dude' }
mutations.addNewUsers(state, [user]) mutations.addNewUsers(state, [user])
expect(state.users).to.have.length(1) expect(state.users).to.have.length(1)
@ -21,7 +21,7 @@ describe('The users module', () => {
it('sets a mute bit on users', () => { it('sets a mute bit on users', () => {
const state = cloneDeep(defaultState) const state = cloneDeep(defaultState)
const user = { id: 1, name: 'Guy' } const user = { id: '1', name: 'Guy' }
mutations.addNewUsers(state, [user]) mutations.addNewUsers(state, [user])
mutations.setMuted(state, {user, muted: true}) mutations.setMuted(state, {user, muted: true})
@ -38,11 +38,11 @@ describe('The users module', () => {
it('returns user with matching screen_name', () => { it('returns user with matching screen_name', () => {
const state = { const state = {
users: [ users: [
{ screen_name: 'Guy', id: 1 } { screen_name: 'Guy', id: '1' }
] ]
} }
const name = 'Guy' const name = 'Guy'
const expected = { screen_name: 'Guy', id: 1 } const expected = { screen_name: 'Guy', id: '1' }
expect(getters.userByName(state)(name)).to.eql(expected) expect(getters.userByName(state)(name)).to.eql(expected)
}) })
}) })
@ -51,11 +51,11 @@ describe('The users module', () => {
it('returns user with matching id', () => { it('returns user with matching id', () => {
const state = { const state = {
users: [ users: [
{ screen_name: 'Guy', id: 1 } { screen_name: 'Guy', id: '1' }
] ]
} }
const id = 1 const id = '1'
const expected = { screen_name: 'Guy', id: 1 } const expected = { screen_name: 'Guy', id: '1' }
expect(getters.userById(state)(id)).to.eql(expected) expect(getters.userById(state)(id)).to.eql(expected)
}) })
}) })

View File

@ -9,15 +9,15 @@ describe('NotificationUtils', () => {
notifications: { notifications: {
data: [ data: [
{ {
action: { id: 1 }, action: { id: '1' },
type: 'like' type: 'like'
}, },
{ {
action: { id: 2 }, action: { id: '2' },
type: 'mention' type: 'mention'
}, },
{ {
action: { id: 3 }, action: { id: '3' },
type: 'repeat' type: 'repeat'
} }
] ]
@ -34,11 +34,11 @@ describe('NotificationUtils', () => {
} }
const expected = [ const expected = [
{ {
action: { id: 3 }, action: { id: '3' },
type: 'repeat' type: 'repeat'
}, },
{ {
action: { id: 1 }, action: { id: '1' },
type: 'like' type: 'like'
} }
] ]
@ -54,12 +54,12 @@ describe('NotificationUtils', () => {
notifications: { notifications: {
data: [ data: [
{ {
action: { id: 1 }, action: { id: '1' },
type: 'like', type: 'like',
seen: false seen: false
}, },
{ {
action: { id: 2 }, action: { id: '2' },
type: 'mention', type: 'mention',
seen: true seen: true
} }
@ -77,7 +77,7 @@ describe('NotificationUtils', () => {
} }
const expected = [ const expected = [
{ {
action: { id: 1 }, action: { id: '1' },
type: 'like', type: 'like',
seen: false seen: false
} }