diff --git a/backend/src/middleware/permissionsMiddleware.js b/backend/src/middleware/permissionsMiddleware.js
index 3688aec16..85c584407 100644
--- a/backend/src/middleware/permissionsMiddleware.js
+++ b/backend/src/middleware/permissionsMiddleware.js
@@ -75,6 +75,7 @@ const permissions = shield({
DeleteBadge: isAdmin,
AddUserBadges: isAdmin,
CreateSocialMedia: isAuthenticated,
+ DeleteSocialMedia: isAuthenticated,
// AddBadgeRewarded: isAdmin,
// RemoveBadgeRewarded: isAdmin,
reward: isAdmin,
diff --git a/backend/src/resolvers/socialMedia.js b/backend/src/resolvers/socialMedia.js
index 310375820..ef143a478 100644
--- a/backend/src/resolvers/socialMedia.js
+++ b/backend/src/resolvers/socialMedia.js
@@ -3,6 +3,9 @@ import { neo4jgraphql } from 'neo4j-graphql-js'
export default {
Mutation: {
CreateSocialMedia: async (object, params, context, resolveInfo) => {
+ /**
+ * TODO?: Creates double Nodes!
+ */
const socialMedia = await neo4jgraphql(object, params, context, resolveInfo, false)
const session = context.driver.session()
await session.run(
@@ -15,6 +18,11 @@ export default {
)
session.close()
+ return socialMedia
+ },
+ DeleteSocialMedia: async (object, params, context, resolveInfo) => {
+ const socialMedia = await neo4jgraphql(object, params, context, resolveInfo, false)
+
return socialMedia
}
}
diff --git a/backend/src/resolvers/socialMedia.spec.js b/backend/src/resolvers/socialMedia.spec.js
index b97316543..b09dae178 100644
--- a/backend/src/resolvers/socialMedia.spec.js
+++ b/backend/src/resolvers/socialMedia.spec.js
@@ -7,9 +7,18 @@ const factory = Factory()
describe('CreateSocialMedia', () => {
let client
let headers
- const mutation = `
+ const mutationC = `
mutation($url: String!) {
CreateSocialMedia(url: $url) {
+ id
+ url
+ }
+ }
+ `
+ const mutationD = `
+ mutation($id: ID!) {
+ DeleteSocialMedia(id: $id) {
+ id
url
}
}
@@ -30,20 +39,63 @@ describe('CreateSocialMedia', () => {
await factory.cleanDatabase()
})
+ describe('unauthenticated', () => {
+ it('throws authorization error', async () => {
+ client = new GraphQLClient(host)
+ const variables = { url: 'http://nsosp.org' }
+ await expect(
+ client.request(mutationC, variables)
+ ).rejects.toThrow('Not Authorised')
+ })
+ })
+
describe('authenticated', () => {
beforeEach(async () => {
headers = await login({ email: 'test@example.org', password: '1234' })
client = new GraphQLClient(host, { headers })
})
+ it('creates social media with correct URL', async () => {
+ const variables = { url: 'http://nsosp.org' }
+ await expect(
+ client.request(mutationC, variables)
+ ).resolves.toEqual(expect.objectContaining({
+ CreateSocialMedia: {
+ id: expect.any(String),
+ url: 'http://nsosp.org'
+ }
+ }))
+ })
+
+ it('deletes social media', async () => {
+ const variablesC = { url: 'http://nsosp.org' }
+ const { CreateSocialMedia } = await client.request(mutationC, variablesC)
+ const { id } = CreateSocialMedia
+
+ const variablesD = { id }
+ const expected = {
+ DeleteSocialMedia: {
+ id: id,
+ url: 'http://nsosp.org'
+ }
+ }
+ await expect(
+ client.request(mutationD, variablesD)
+ ).resolves.toEqual(expected)
+ })
+
it('rejects empty string', async () => {
const variables = { url: '' }
- await expect(client.request(mutation, variables)).rejects.toThrow('Input is not a URL')
+ await expect(
+ client.request(mutationC, variables)
+ ).rejects.toThrow('Input is not a URL')
})
it('validates URLs', async () => {
const variables = { url: 'not-a-url' }
- await expect(client.request(mutation, variables)).rejects.toThrow('Input is not a URL')
+ await expect(
+ client.request(mutationC, variables)
+ ).rejects.toThrow('Input is not a URL')
})
})
})
diff --git a/webapp/pages/settings/my-social-media.vue b/webapp/pages/settings/my-social-media.vue
index f1714655f..425f4c726 100644
--- a/webapp/pages/settings/my-social-media.vue
+++ b/webapp/pages/settings/my-social-media.vue
@@ -22,26 +22,38 @@
>
{{ link.url }}
+ |
+