243 lines
8.6 KiB
JavaScript
243 lines
8.6 KiB
JavaScript
/* istanbul ignore file */
|
|
const expect = require('chai').expect
|
|
|
|
const appRoot = require('app-root-path')
|
|
const { createUser } = require('../../core/services/users')
|
|
const { createPersonalAccessToken } = require('../../core/services/tokens')
|
|
const { createObject } = require('../../core/services/objects')
|
|
const { getUserActivity } = require('../services')
|
|
|
|
const { beforeEachContext, initializeTestServer } = require(`${appRoot}/test/hooks`)
|
|
const { noErrors } = require(`${appRoot}/test/helpers`)
|
|
|
|
let sendRequest
|
|
|
|
describe('Activity @activity', () => {
|
|
let server
|
|
|
|
let userIz = {
|
|
name: 'Izzy Lyseggen',
|
|
email: 'izzybizzi@speckle.systems',
|
|
password: 'sp0ckle sucks 9001'
|
|
}
|
|
|
|
let userCr = {
|
|
name: 'Cristi Balas',
|
|
email: 'cristib@speckle.systems',
|
|
password: 'hack3r man 666'
|
|
}
|
|
|
|
let userX = {
|
|
name: 'Mystery User',
|
|
email: 'mysteriousDude@speckle.systems',
|
|
password: 'super $ecret pw0rd'
|
|
}
|
|
|
|
let streamPublic = {
|
|
name: 'a fun stream for sharing',
|
|
description: 'for all to see!',
|
|
isPublic: true
|
|
}
|
|
|
|
let branchPublic = { name: '🍁maple branch' }
|
|
|
|
let streamSecret = {
|
|
name: 'a secret stream for me',
|
|
description: 'for no one to see!',
|
|
isPublic: false
|
|
}
|
|
|
|
let testObj = {
|
|
hello: 'hallo',
|
|
cool: 'kult',
|
|
bunny: 'kanin'
|
|
}
|
|
let testObj2 = {
|
|
goodbye: 'ha det bra',
|
|
warm: 'varmt',
|
|
bunny: 'kanin'
|
|
}
|
|
|
|
before(async () => {
|
|
const { app } = await beforeEachContext()
|
|
;({ server, sendRequest } = await initializeTestServer(app))
|
|
|
|
// create users and tokens
|
|
userIz.id = await createUser(userIz)
|
|
let token = await createPersonalAccessToken(userIz.id, 'izz test token', [
|
|
'streams:read',
|
|
'streams:write',
|
|
'users:read',
|
|
'users:email',
|
|
'tokens:write',
|
|
'tokens:read',
|
|
'profile:read',
|
|
'profile:email'
|
|
])
|
|
userIz.token = `Bearer ${token}`
|
|
|
|
userCr.id = await createUser(userCr)
|
|
userCr.token = `Bearer ${await createPersonalAccessToken(
|
|
userCr.id,
|
|
'cristi test token',
|
|
[
|
|
'streams:read',
|
|
'streams:write',
|
|
'users:read',
|
|
'users:email',
|
|
'tokens:write',
|
|
'tokens:read',
|
|
'profile:read',
|
|
'profile:email'
|
|
]
|
|
)}`
|
|
|
|
userX.id = await createUser(userX)
|
|
userX.token = `Bearer ${await createPersonalAccessToken(
|
|
userX.id,
|
|
'no users:read test token',
|
|
['streams:read', 'streams:write']
|
|
)}`
|
|
})
|
|
|
|
after(async () => {
|
|
await server.close()
|
|
})
|
|
|
|
it('Should create activity', async () => {
|
|
// create stream (cr1)
|
|
const resStream1 = await sendRequest(userCr.token, {
|
|
query:
|
|
'mutation createStream($myStream:StreamCreateInput!) { streamCreate(stream: $myStream) }',
|
|
variables: { myStream: streamSecret }
|
|
})
|
|
expect(noErrors(resStream1))
|
|
streamSecret.id = resStream1.body.data.streamCreate
|
|
|
|
// create commit (cr2)
|
|
testObj2.id = await createObject(streamSecret.id, testObj2)
|
|
const resCommit1 = await sendRequest(userCr.token, {
|
|
query: `mutation { commitCreate(commit: {streamId: "${streamSecret.id}", branchName: "main", objectId: "${testObj2.id}", message: "first commit"})}`
|
|
})
|
|
expect(noErrors(resCommit1))
|
|
|
|
// create stream #2 (iz1)
|
|
const resStream2 = await sendRequest(userIz.token, {
|
|
query:
|
|
'mutation createStream($myStream:StreamCreateInput!) { streamCreate(stream: $myStream) }',
|
|
variables: { myStream: streamPublic }
|
|
})
|
|
expect(noErrors(resStream2))
|
|
streamPublic.id = resStream2.body.data.streamCreate
|
|
|
|
// create branch (iz2)
|
|
const resBranch = await sendRequest(userIz.token, {
|
|
query: `mutation { branchCreate(branch: { streamId: "${streamPublic.id}", name: "${branchPublic.name}" }) }`
|
|
})
|
|
expect(noErrors(resBranch))
|
|
branchPublic.id = resBranch.body.data.branchCreate
|
|
|
|
// create commit #2 (iz3)
|
|
testObj.id = await createObject(streamPublic.id, testObj)
|
|
const resCommit2 = await sendRequest(userIz.token, {
|
|
query: `mutation { commitCreate(commit: { streamId: "${streamPublic.id}", branchName: "${branchPublic.name}", objectId: "${testObj.id}", message: "first commit" })}`
|
|
})
|
|
expect(noErrors(resCommit2))
|
|
|
|
// add collaborator (iz4)
|
|
const resCollab = await sendRequest(userIz.token, {
|
|
query: `mutation { streamGrantPermission( permissionParams: { streamId: "${streamPublic.id}", userId: "${userCr.id}", role: "stream:contributor" } ) }`
|
|
})
|
|
expect(noErrors(resCollab))
|
|
|
|
let { items: activityC } = await getUserActivity({ userId: userCr.id })
|
|
expect(activityC.length).to.equal(3)
|
|
expect(activityC[0].actionType).to.equal('commit_create')
|
|
|
|
let { items: activityI } = await getUserActivity({ userId: userIz.id })
|
|
expect(activityI.length).to.equal(5)
|
|
expect(activityI[0].actionType).to.equal('stream_permissions_add')
|
|
})
|
|
|
|
it("Should get a user's own activity", async () => {
|
|
const res = await sendRequest(userIz.token, {
|
|
query: `query {user(id:"${userIz.id}") { name activity { totalCount items {streamId resourceType resourceId actionType userId message time}}} }`
|
|
})
|
|
expect(noErrors(res))
|
|
let activity = res.body.data.user.activity
|
|
|
|
expect(activity.items.length).to.equal(5)
|
|
expect(activity.totalCount).to.equal(5)
|
|
expect(activity.items[0].actionType).to.equal('stream_permissions_add')
|
|
expect(activity.items[activity.totalCount - 1].actionType).to.equal('user_create')
|
|
})
|
|
|
|
it("Should get another user's activity", async () => {
|
|
const res = await sendRequest(userIz.token, {
|
|
query: `query {user(id:"${userCr.id}") { name activity { totalCount items {streamId resourceType resourceId actionType userId message time}}} }`
|
|
})
|
|
expect(noErrors(res))
|
|
expect(res.body.data.user.activity.items.length).to.equal(3)
|
|
expect(res.body.data.user.activity.totalCount).to.equal(3)
|
|
})
|
|
|
|
it("Should get a user's timeline", async () => {
|
|
const res = await sendRequest(userIz.token, {
|
|
query: `query {user(id:"${userCr.id}") { name timeline { totalCount items {streamId resourceType resourceId actionType userId message time}}} }`
|
|
})
|
|
expect(noErrors(res))
|
|
expect(res.body.data.user.timeline.items.length).to.equal(6) // sum of all actions in 'should create activity'
|
|
expect(res.body.data.user.timeline.totalCount).to.equal(6)
|
|
})
|
|
|
|
it("Should get a stream's activity", async () => {
|
|
const res = await sendRequest(userCr.token, {
|
|
query: `query { stream(id: "${streamPublic.id}") { activity { totalCount items {streamId resourceId actionType message} } } }`
|
|
})
|
|
expect(noErrors(res))
|
|
let activity = res.body.data.stream.activity
|
|
expect(activity.items.length).to.equal(4)
|
|
expect(activity.totalCount).to.equal(4)
|
|
expect(activity.items[activity.totalCount - 1].actionType).to.equal('stream_create')
|
|
})
|
|
|
|
it("Should get a branch's activity", async () => {
|
|
const res = await sendRequest(userCr.token, {
|
|
query: `query { stream(id: "${streamPublic.id}") { branch(name: "${branchPublic.name}") { activity { totalCount items {streamId resourceId actionType message} } } } }`
|
|
})
|
|
expect(noErrors(res))
|
|
let activity = res.body.data.stream.branch.activity
|
|
expect(activity.items.length).to.equal(1)
|
|
expect(activity.totalCount).to.equal(1)
|
|
expect(activity.items[0].actionType).to.equal('branch_create')
|
|
})
|
|
|
|
it("Should *not* get a stream's activity if you don't have access to it", async () => {
|
|
const res = await sendRequest(userIz.token, {
|
|
query: `query {stream(id:"${streamSecret.id}") {name activity {items {streamId resourceType resourceId actionType userId message time}}} }`
|
|
})
|
|
expect(res.body.errors.length).to.equal(1)
|
|
})
|
|
|
|
it("Should *not* get a stream's activity if you are not a server user", async () => {
|
|
const res = await sendRequest(null, {
|
|
query: `query {stream(id:"${streamPublic.id}") {name activity {items {streamId resourceType resourceId actionType userId message time}}} }`
|
|
})
|
|
expect(res.body.errors.length).to.equal(1)
|
|
})
|
|
|
|
it("Should *not* get a user's activity without the `users:read` scope", async () => {
|
|
const res = await sendRequest(userX.token, {
|
|
query: `query {user(id:"${userCr.id}") { name activity {items {streamId resourceType resourceId actionType userId message time}}} }`
|
|
})
|
|
expect(res.body.errors.length).to.equal(1)
|
|
})
|
|
|
|
it("Should *not* get a user's timeline without the `users:read` scope", async () => {
|
|
const res = await sendRequest(userX.token, {
|
|
query: `query {user(id:"${userCr.id}") { name timeline {items {streamId resourceType resourceId actionType userId message time}}} }`
|
|
})
|
|
expect(res.body.errors.length).to.equal(1)
|
|
})
|
|
})
|