diff --git a/backend/src/middleware/notifications/index.js b/backend/src/middleware/notifications/index.js
index 89d86bed3..942eb588d 100644
--- a/backend/src/middleware/notifications/index.js
+++ b/backend/src/middleware/notifications/index.js
@@ -1,11 +1,13 @@
import extractIds from './extractMentions'
const notify = async (resolve, root, args, context, resolveInfo) => {
- const ids = extractIds(args.content) // before mention class gets removed
+ // extract user ids before xss-middleware removes link classes
+ const ids = extractIds(args.content)
+
const post = await resolve(root, args, context, resolveInfo)
const session = context.driver.session()
- const { content, id: postId } = post
+ const { id: postId } = post
const createdAt = (new Date()).toISOString()
const cypher = `
match(u:User) where u.id in $ids
@@ -22,6 +24,7 @@ const notify = async (resolve, root, args, context, resolveInfo) => {
export default {
Mutation: {
- CreatePost: notify
+ CreatePost: notify,
+ UpdatePost: notify
}
}
diff --git a/backend/src/middleware/notifications/spec.js b/backend/src/middleware/notifications/spec.js
index c7dd99613..786ee7115 100644
--- a/backend/src/middleware/notifications/spec.js
+++ b/backend/src/middleware/notifications/spec.js
@@ -74,16 +74,50 @@ describe('currentUser { notifications }', () => {
})
it('sends you a notification', async () => {
- const newContent = 'Hey @al-capone how do you do?'
+ const expectedContent = 'Hey @al-capone how do you do?'
const expected = {
currentUser: {
notifications: [
- { read: false, post: { content: newContent } }
+ { read: false, post: { content: expectedContent } }
]
}
}
await expect(client.request(query, { read: false })).resolves.toEqual(expected)
})
+
+ describe('who mentions me again', () => {
+ beforeEach(async () => {
+ const updatedContent = `${post.content} One more mention to @al-capone`
+ // The response `post.content` contains a link but the XSSmiddleware
+ // should have the `mention` CSS class removed. I discovered this
+ // during development and thought: A feature not a bug! This way we
+ // can encode a re-mentioning of users when you edit your post or
+ // comment.
+ const createPostMutation = `
+ mutation($id: ID!, $content: String!) {
+ UpdatePost(id: $id, content: $content) {
+ title
+ content
+ }
+ }
+ `
+ authorClient = new GraphQLClient(host, { headers: authorHeaders })
+ await authorClient.request(createPostMutation, { id: post.id, content: updatedContent })
+ })
+
+ it('creates exactly one more notification', async () => {
+ const expectedContent = 'Hey @al-capone how do you do? One more mention to @al-capone'
+ const expected = {
+ currentUser: {
+ notifications: [
+ { read: false, post: { content: expectedContent } },
+ { read: false, post: { content: expectedContent } }
+ ]
+ }
+ }
+ await expect(client.request(query, { read: false })).resolves.toEqual(expected)
+ })
+ })
})
})
})