175 lines
5.1 KiB
TypeScript
175 lines
5.1 KiB
TypeScript
import {
|
|
createRandomEmail,
|
|
createRandomString
|
|
} from '@/modules/core/helpers/testHelpers'
|
|
import {
|
|
assignToWorkspace,
|
|
BasicTestWorkspace,
|
|
createTestWorkspace
|
|
} from '@/modules/workspaces/tests/helpers/creation'
|
|
import { BasicTestUser, createTestUser, login } from '@/test/authHelper'
|
|
import {
|
|
GetProjectInvitableCollaboratorsDocument,
|
|
SetUserActiveWorkspaceDocument,
|
|
UserActiveResourcesDocument
|
|
} from '@/test/graphql/generated/graphql'
|
|
import { testApolloServer, TestApolloServer } from '@/test/graphqlHelper'
|
|
import { beforeEachContext } from '@/test/hooks'
|
|
import { BasicTestStream, createTestStream } from '@/test/speckle-helpers/streamHelper'
|
|
import { Roles } from '@speckle/shared'
|
|
import { expect } from 'chai'
|
|
import cryptoRandomString from 'crypto-random-string'
|
|
|
|
describe('ActiveUserMutations.setActiveWorkspace', () => {
|
|
let apollo: TestApolloServer
|
|
|
|
const user: BasicTestUser = {
|
|
id: '',
|
|
name: 'John Legacy Speckle',
|
|
email: createRandomEmail()
|
|
}
|
|
|
|
const workspace: BasicTestWorkspace = {
|
|
id: '',
|
|
ownerId: '',
|
|
name: 'My Workspace',
|
|
slug: ''
|
|
}
|
|
|
|
const project: BasicTestStream = {
|
|
id: '',
|
|
ownerId: '',
|
|
name: 'My Project',
|
|
isPublic: true
|
|
}
|
|
|
|
before(async () => {
|
|
await beforeEachContext()
|
|
await createTestUser(user)
|
|
await createTestWorkspace(workspace, user)
|
|
await createTestStream(project, user)
|
|
|
|
apollo = await testApolloServer({ authUserId: user.id })
|
|
})
|
|
|
|
it('should accurately report active workspace', async () => {
|
|
const resA = await apollo.execute(SetUserActiveWorkspaceDocument, {
|
|
slug: workspace.slug
|
|
})
|
|
expect(resA).to.not.haveGraphQLErrors()
|
|
|
|
const resB = await apollo.execute(UserActiveResourcesDocument, {})
|
|
expect(resB).to.not.haveGraphQLErrors()
|
|
|
|
expect(resB?.data?.activeUser?.activeWorkspace?.id).to.equal(workspace.id)
|
|
})
|
|
|
|
it('should accurately report if last visited project is not a workspace project', async () => {
|
|
const resA = await apollo.execute(SetUserActiveWorkspaceDocument, {
|
|
slug: null,
|
|
isProjectsActive: true
|
|
})
|
|
expect(resA).to.not.haveGraphQLErrors()
|
|
|
|
const resB = await apollo.execute(UserActiveResourcesDocument, {})
|
|
expect(resB).to.not.haveGraphQLErrors()
|
|
|
|
expect(resB?.data?.activeUser?.isProjectsActive).to.be.true
|
|
})
|
|
|
|
it('should allow values to be cleared with null input', async () => {
|
|
const resA = await apollo.execute(SetUserActiveWorkspaceDocument, {
|
|
slug: workspace.slug
|
|
})
|
|
expect(resA).to.not.haveGraphQLErrors()
|
|
const resB = await apollo.execute(SetUserActiveWorkspaceDocument, { slug: null })
|
|
expect(resB).to.not.haveGraphQLErrors()
|
|
|
|
const resC = await apollo.execute(UserActiveResourcesDocument, {})
|
|
expect(resC).to.not.haveGraphQLErrors()
|
|
|
|
expect(resC.data?.activeUser?.activeWorkspace).to.be.null
|
|
})
|
|
|
|
it('should return null if workspace is not found or was deleted', async () => {
|
|
const resA = await apollo.execute(SetUserActiveWorkspaceDocument, {
|
|
slug: cryptoRandomString({ length: 9 })
|
|
})
|
|
expect(resA).to.not.haveGraphQLErrors()
|
|
|
|
const resB = await apollo.execute(UserActiveResourcesDocument, {})
|
|
expect(resB).to.not.haveGraphQLErrors()
|
|
|
|
expect(resB?.data?.activeUser?.activeWorkspace).to.be.null
|
|
})
|
|
})
|
|
|
|
describe('Project.invitableCollaborators', () => {
|
|
it('should return invitable collaborators', async () => {
|
|
const admin = await createTestUser({
|
|
name: createRandomString(),
|
|
email: createRandomEmail(),
|
|
role: Roles.Server.User,
|
|
verified: true
|
|
})
|
|
const workspace = {
|
|
id: createRandomString(),
|
|
name: createRandomString(),
|
|
slug: createRandomString(),
|
|
ownerId: admin.id
|
|
}
|
|
await createTestWorkspace(workspace, admin)
|
|
|
|
const member = await createTestUser({
|
|
name: createRandomString(),
|
|
email: createRandomEmail(),
|
|
role: Roles.Server.User,
|
|
verified: true
|
|
})
|
|
await assignToWorkspace(workspace, member, Roles.Workspace.Member)
|
|
|
|
// Non workspace member
|
|
await createTestUser({
|
|
name: createRandomString(),
|
|
email: createRandomEmail(),
|
|
role: Roles.Server.User,
|
|
verified: true
|
|
})
|
|
|
|
const projectMember = await createTestUser({
|
|
name: createRandomString(),
|
|
email: createRandomEmail(),
|
|
role: Roles.Server.User,
|
|
verified: true
|
|
})
|
|
|
|
const project = {
|
|
id: createRandomString(),
|
|
workspaceId: workspace.id
|
|
}
|
|
await createTestStream(project, projectMember)
|
|
|
|
// User in another project should still be invitable
|
|
const otherProject = {
|
|
id: createRandomString(),
|
|
workspaceId: workspace.id
|
|
}
|
|
await createTestStream(otherProject, admin)
|
|
|
|
const session = await login(admin)
|
|
|
|
const res = await session.execute(GetProjectInvitableCollaboratorsDocument, {
|
|
projectId: project.id
|
|
})
|
|
expect(res).not.haveGraphQLErrors()
|
|
|
|
const invitable = res.data?.project.invitableCollaborators
|
|
expect(invitable?.totalCount).to.eq(2)
|
|
expect(invitable?.items).to.have.length(2)
|
|
expect(invitable?.items).to.deep.equalInAnyOrder([
|
|
{ id: admin.id, user: { name: admin.name } },
|
|
{ id: member.id, user: { name: member.name } }
|
|
])
|
|
})
|
|
})
|