Files
workavia-drive/twake/backend/node/test/e2e/channels/channels.rest.spec.ts
T
montaghanmy 10fe6f78d1 feat: init
2023-03-23 11:03:16 +01:00

1351 lines
41 KiB
TypeScript

import { afterEach, beforeAll, beforeEach, describe, expect, it } from "@jest/globals";
import { v1 as uuidv1 } from "uuid";
import { deserialize } from "class-transformer";
import { init, TestPlatform } from "../setup";
import {
ResourceGetResponse,
ResourceListResponse,
ResourceUpdateResponse,
User,
Workspace,
} from "../../../src/utils/types";
import { Channel, ChannelMember } from "../../../src/services/channels/entities";
import {
ChannelExecutionContext,
ChannelVisibility,
WorkspaceExecutionContext,
} from "../../../src/services/channels/types";
import {
getPrivateRoomName,
getPublicRoomName,
} from "../../../src/services/channels/services/channel/realtime";
import { ChannelUtils, get as getChannelUtils } from "./utils";
import { TestDbService } from "../utils.prepare.db";
import { ChannelObject } from "../../../src/services/channels/services/channel/types";
import { Api } from "../utils.api";
import gr from "../../../src/services/global-resolver";
import { createMessage, e2e_createThread } from "../messages/utils";
describe("The /internal/services/channels/v1 API", () => {
const url = "/internal/services/channels/v1";
let platform: TestPlatform;
let channelUtils: ChannelUtils;
let testDbService: TestDbService;
let api: Api;
beforeAll(async end => {
// platform = await init();
// await platform.database.getConnector().drop();
end();
});
beforeEach(async () => {
platform = await init();
testDbService = new TestDbService(platform);
api = new Api(platform);
channelUtils = getChannelUtils(platform);
});
afterEach(async () => {
await platform?.tearDown();
platform = null;
});
async function testAccess(url, method, done) {
const jwtToken = await platform.auth.getJWTToken();
const response = await platform.app.inject({
method,
url,
headers: {
authorization: `Bearer ${jwtToken}`,
},
});
expect(response.statusCode).toBe(400);
done();
}
function getContext(user?: User): WorkspaceExecutionContext {
return {
workspace: platform.workspace,
user: user || platform.currentUser,
};
}
/**
* Get a new channel instance
*
* @param owner will be a random uuidv4 if not defined
*/
function getChannel(owner: string = uuidv1()): Channel {
const channel = new Channel();
channel.name = "Test Channel";
channel.company_id = platform.workspace.company_id;
channel.workspace_id = platform.workspace.workspace_id;
channel.is_default = false;
channel.visibility = ChannelVisibility.PRIVATE;
channel.archived = false;
channel.owner = owner;
return channel;
}
async function getChannelREST(channelId: string): Promise<ChannelObject> {
const response = await api.get(
`${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels/${channelId}`,
);
expect(response.statusCode).toEqual(200);
const channelGetResult: ResourceGetResponse<ChannelObject> = deserialize(
ResourceGetResponse,
response.body,
);
return channelGetResult.resource;
}
describe("The GET /companies/:companyId/workspaces/:workspaceId/channels route", () => {
it("should 400 when companyId is not valid", async done => {
testAccess(
`${url}/companies/123/workspaces/${platform.workspace.workspace_id}/channels`,
"GET",
done,
);
});
it("should 400 when workspaceId is not valid", async done => {
testAccess(
`${url}/companies/${platform.workspace.company_id}/workspaces/123/channels`,
"GET",
done,
);
});
it("should return empty list of channels", async done => {
const jwtToken = await platform.auth.getJWTToken();
const response = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
});
const result: ResourceListResponse<Channel> = deserialize(
ResourceListResponse,
response.body,
);
expect(response.statusCode).toBe(200);
expect(result.resources.length).toEqual(0);
done();
});
it("should return list of workspace channels", async done => {
const channel = new Channel();
channel.name = "Test Channel";
const creationResult = await gr.services.channels.channels.save(channel, {}, getContext());
const jwtToken = await platform.auth.getJWTToken();
const response = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
});
const result: ResourceListResponse<ChannelObject> = deserialize(
ResourceListResponse,
response.body,
);
expect(response.statusCode).toBe(200);
expect(result.resources.length).toEqual(1);
expect(result.resources[0]).toMatchObject({
id: creationResult.entity.id,
name: channel.name,
});
result.resources.forEach(r => {
expect(r.stats).toMatchObject({
members: 1,
messages: 0,
});
});
done();
});
it("should return list of channels the user is member of", async done => {
const ws0pk = { id: uuidv1(), company_id: platform.workspace.company_id };
await testDbService.createWorkspace(ws0pk);
const newUser = await testDbService.createUser([ws0pk]);
const channel1 = getChannel();
const channel2 = getChannel();
channel1.name = "Test Channel1";
channel2.name = "Test Channel2";
const creationResults = await Promise.all([
gr.services.channels.channels.save(channel1, {}, getContext()),
gr.services.channels.channels.save(channel2, {}, getContext()),
]);
await gr.services.channels.members.save(
{
channel_id: channel1.id,
workspace_id: channel1.workspace_id,
company_id: channel1.company_id,
user_id: newUser.id,
} as ChannelMember,
channelUtils.getChannelContext(channel1, platform.currentUser),
);
const jwtToken = await platform.auth.getJWTToken({ sub: newUser.id });
const response = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
query: {
mine: "true",
},
});
console.log(response.body);
const result: ResourceListResponse<Channel> = deserialize(
ResourceListResponse,
response.body,
);
expect(response.statusCode).toBe(200);
expect(result.resources.length).toEqual(1);
expect(result.resources[0]).toMatchObject({
id: creationResults[0].entity.id,
});
done();
});
it("should return pagination information when not all channels are returned", async done => {
await Promise.all(
"0123456789".split("").map(name => {
const channel = new Channel();
channel.name = name;
return gr.services.channels.channels.save(channel, {}, getContext());
}),
).catch(() => done(new Error("Failed on creation")));
const jwtToken = await platform.auth.getJWTToken();
const response = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
query: {
limit: "5",
},
});
const result: ResourceListResponse<Channel> = deserialize(
ResourceListResponse,
response.body,
);
expect(response.statusCode).toBe(200);
expect(result.resources.length).toEqual(5);
expect(result.next_page_token).toBeDefined;
done();
});
it("should be able to paginate over channels from pagination information", async done => {
await platform.database.getConnector().drop();
await Promise.all(
"0123456789".split("").map(name => {
const channel = new Channel();
channel.name = name;
return gr.services.channels.channels.save(channel, {}, getContext());
}),
).catch(() => done(new Error("Failed on creation")));
const jwtToken = await platform.auth.getJWTToken();
const firstPage = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
query: {
limit: "5",
},
});
const firstPageChannels: ResourceListResponse<Channel> = deserialize(
ResourceListResponse,
firstPage.body,
);
expect(firstPage.statusCode).toBe(200);
expect(firstPageChannels.resources.length).toEqual(5);
expect(firstPageChannels.next_page_token).toBeDefined;
const nextPage = firstPageChannels.next_page_token;
const secondPage = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
query: {
limit: "5",
page_token: nextPage,
},
});
const secondPageChannels: ResourceListResponse<Channel> = deserialize(
ResourceListResponse,
secondPage.body,
);
expect(secondPage.statusCode).toBe(200);
expect(secondPageChannels.resources.length).toEqual(5);
expect(
new Set([
...firstPageChannels.resources.map(resource => resource.id),
...secondPageChannels.resources.map(resource => resource.id),
]).size,
).toEqual(10);
done();
});
it("should not return pagination information when all channels are returned", async done => {
await Promise.all(
"0123456789".split("").map(name => {
const channel = new Channel();
channel.name = name;
return gr.services.channels.channels.save(channel, {}, getContext());
}),
).catch(() => done(new Error("Failed on creation")));
const jwtToken = await platform.auth.getJWTToken();
const response = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
query: {
limit: "11",
},
});
const result: ResourceListResponse<Channel> = deserialize(
ResourceListResponse,
response.body,
);
expect(response.statusCode).toBe(200);
expect(result.resources.length).toEqual(10);
expect(result.next_page_token).not.toBeDefined;
done();
});
it("should return websockets information", async done => {
const jwtToken = await platform.auth.getJWTToken();
const response = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
query: {
websockets: "true",
},
});
const result: ResourceListResponse<Channel> = deserialize(
ResourceListResponse,
response.body,
);
expect(response.statusCode).toBe(200);
expect(result.websockets).toMatchObject([
{ room: getPublicRoomName(platform.workspace) },
// user id is randomly generated
{ room: expect.stringContaining(getPrivateRoomName(platform.workspace, { id: "" })) },
]);
done();
});
it.skip("should return websockets and direct information", async done => {
const jwtToken = await platform.auth.getJWTToken();
const response = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
query: {
websockets: "true",
mine: "true",
},
});
const result: ResourceListResponse<Channel> = deserialize(
ResourceListResponse,
response.body,
);
expect(response.statusCode).toBe(200);
expect(result.websockets.length).toEqual(3);
done();
});
});
describe("The GET /companies/:companyId/workspaces/:workspaceId/channels/:id route", () => {
it("should 400 when companyId is not valid", async done => {
const channelId = "1";
testAccess(
`${url}/companies/123/workspaces/${platform.workspace.workspace_id}/channels/${channelId}`,
"GET",
done,
);
});
it("should 400 when workspaceId is not valid", async done => {
const channelId = "1";
testAccess(
`${url}/companies/${platform.workspace.company_id}/workspaces/123/channels/${channelId}`,
"GET",
done,
);
});
it("should return the requested channel", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = new Channel();
channel.name = "Test Channel";
channel.company_id = platform.workspace.company_id;
channel.workspace_id = platform.workspace.workspace_id;
const creationResult = await gr.services.channels.channels.save(channel, {}, getContext());
const response = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels/${creationResult.entity.id}`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
});
expect(response.statusCode).toEqual(200);
const channelGetResult: ResourceGetResponse<Channel> = deserialize(
ResourceGetResponse,
response.body,
);
expect(channelGetResult.resource).toBeDefined();
expect(channelGetResult.resource).toMatchObject({
id: String(creationResult.entity.id),
name: creationResult.entity.name,
});
expect(channelGetResult.websocket).toBeDefined();
expect(channelGetResult.websocket).toMatchObject({
name: creationResult.entity.name,
room: `/channels/${creationResult.entity.id}`,
token: expect.any(String),
});
done();
});
it("channel counters", async done => {
await platform.database.getConnector().drop();
await testDbService.createDefault(platform);
const channel = new Channel();
channel.name = "Test counters Channel";
channel.company_id = platform.workspace.company_id;
channel.workspace_id = platform.workspace.workspace_id;
channel.is_default = true;
channel.visibility = ChannelVisibility.PUBLIC;
channel.description = "test counters";
channel.channel_group = "my channel group";
const creationResult = await gr.services.channels.channels.save(channel, {}, getContext());
const channelId = creationResult.entity.id;
let resource = await getChannelREST(channelId);
expect(resource).toMatchObject({
company_id: platform.workspace.company_id,
workspace_id: platform.workspace.workspace_id,
// type: expect.stringMatching(/workspace|direct/), // TODO
id: expect.any(String),
icon: expect.any(String),
name: channel.name,
description: channel.description,
channel_group: channel.channel_group,
visibility: channel.visibility,
default: channel.is_default,
owner: platform.currentUser.id,
last_activity: expect.any(Number),
archived: false,
archivation_date: 0, //Timestamp
user_member: expect.any(Object),
stats: expect.any(Object),
});
expect(resource.stats).toMatchObject({
members: 1,
messages: 0,
});
expect(resource.user_member).toMatchObject({
id: expect.any(String),
user_id: platform.currentUser.id,
type: expect.stringMatching(/member|guest|bot/),
last_access: 0, //Timestamp in seconds
last_increment: 0, //Number
favorite: false,
// notification_level: "all" | "none" | "group_mentions" | "user_mentions", // TODO
});
const anotherUserId = uuidv1();
await gr.services.channels.members.addUsersToChannel(
[
{ id: anotherUserId },
{ id: uuidv1() },
{ id: uuidv1() },
{ id: uuidv1() },
{ id: uuidv1() },
],
creationResult.entity,
{
user: { id: platform.currentUser.id },
},
);
resource = await getChannelREST(channelId);
expect(resource.stats).toMatchObject({
members: 6,
messages: 0,
});
await gr.services.channels.members.delete(
{
...platform.workspace,
channel_id: channelId,
user_id: anotherUserId,
},
{ channel: creationResult.entity, user: platform.currentUser } as ChannelExecutionContext,
);
resource = await getChannelREST(channelId);
expect(resource.stats).toMatchObject({
members: 5,
messages: 0,
});
done();
});
});
describe("The POST /companies/:companyId/workspaces/:workspaceId/channels route", () => {
it("should 400 when companyId is not valid", async done => {
testAccess(
`${url}/companies/123/workspaces/${platform.workspace.workspace_id}/channels`,
"POST",
done,
);
});
it("should 400 when workspaceId is not valid", async done => {
testAccess(
`${url}/companies/${platform.workspace.company_id}/workspaces/123/channels`,
"POST",
done,
);
});
it("should create a channel", async done => {
const jwtToken = await platform.auth.getJWTToken();
const response = await platform.app.inject({
method: "POST",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
payload: {
resource: {
name: "Test channel",
},
},
});
expect(response.statusCode).toEqual(201);
const channelCreateResult: ResourceGetResponse<ChannelObject> = deserialize(
ResourceGetResponse,
response.body,
);
expect(channelCreateResult.resource).toBeDefined();
expect(channelCreateResult.websocket).toBeDefined();
const res = channelCreateResult.resource;
const createdChannel = await gr.services.channels.channels.get({
company_id: res.company_id,
workspace_id: res.workspace_id,
id: res.id,
});
expect(channelCreateResult.websocket).toMatchObject({
room: `/channels/${createdChannel.id}`,
token: expect.any(String),
});
expect(createdChannel).toBeDefined();
done();
});
it("should fail when channel name is not defined", async done => {
const jwtToken = await platform.auth.getJWTToken();
const response = await platform.app.inject({
method: "POST",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
payload: {
resource: {
description: "The channel description",
},
},
});
expect(response.statusCode).toEqual(400);
done();
});
});
describe.skip("The POST /companies/:companyId/workspaces/:workspaceId/channels/:id route", () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
async function updateChannel(jwtToken: string, id: string, resource: any): Promise<Channel> {
const response = await platform.app.inject({
method: "POST",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels/${id}`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
payload: {
resource,
},
});
const channelUpdateResult: ResourceUpdateResponse<Channel> = deserialize(
ResourceUpdateResponse,
response.body,
);
expect(channelUpdateResult.resource).toBeDefined();
expect(channelUpdateResult.websocket).toBeDefined();
return await gr.services.channels.channels.get({
id,
company_id: platform.workspace.company_id,
workspace_id: platform.workspace.workspace_id,
});
}
async function updateChannelFail(
jwtToken: string,
id: string,
resource: unknown,
expectedCode: number,
): Promise<void> {
const response = await platform.app.inject({
method: "POST",
url: `${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels/${id}`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
payload: {
resource,
},
});
expect(response.statusCode).toEqual(expectedCode);
}
it("should 400 when companyId is not valid", async done => {
testAccess(
`${url}/companies/123/workspaces/${platform.workspace.workspace_id}/channels/1`,
"POST",
done,
);
});
it("should 400 when workspaceId is not valid", async done => {
testAccess(
`${url}/companies/${platform.workspace.company_id}/workspaces/123/channels/1`,
"POST",
done,
);
});
describe("When user is workspace moderator and channel has been created by other user", () => {
beforeEach(() => {
platform.currentUser.isWorkspaceModerator = true;
});
it("should fail when resource is not defined", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
await updateChannelFail(jwtToken, creationResult.entity.id, {}, 400);
done();
});
it("should be able to update the is_default field", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
const updatedChannel = await updateChannel(jwtToken, creationResult.entity.id, {
is_default: true,
});
expect(updatedChannel).toMatchObject({
id: channel.id,
name: "Test Channel",
company_id: channel.company_id,
workspace_id: channel.workspace_id,
is_default: true,
visibility: channel.visibility,
archived: channel.archived,
owner: channel.owner,
});
done();
});
it("should be able to update the visibility field", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
const updatedChannel = await updateChannel(jwtToken, creationResult.entity.id, {
visibility: ChannelVisibility.PUBLIC,
});
expect(updatedChannel).toMatchObject({
id: channel.id,
name: "Test Channel",
company_id: channel.company_id,
workspace_id: channel.workspace_id,
is_default: channel.is_default,
visibility: ChannelVisibility.PUBLIC,
archived: channel.archived,
owner: channel.owner,
});
done();
});
it("should be able to update the archived field", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
const updatedChannel = await updateChannel(jwtToken, creationResult.entity.id, {
archived: true,
});
expect(updatedChannel).toMatchObject({
id: channel.id,
name: "Test Channel",
company_id: channel.company_id,
workspace_id: channel.workspace_id,
is_default: channel.is_default,
visibility: channel.visibility,
archived: true,
owner: channel.owner,
});
done();
});
it("should be able to update all the fields at the same time", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
const updatedChannel = await updateChannel(jwtToken, creationResult.entity.id, {
visibility: ChannelVisibility.PUBLIC,
is_default: true,
archived: true,
});
expect(updatedChannel).toMatchObject({
id: channel.id,
name: "Test Channel",
company_id: channel.company_id,
workspace_id: channel.workspace_id,
is_default: true,
visibility: ChannelVisibility.PUBLIC,
archived: true,
owner: channel.owner,
});
done();
});
});
describe("When user is channel owner", () => {
beforeEach(() => {
platform.currentUser.isWorkspaceModerator = false;
});
it("should be able to update the is_default field", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel(platform.currentUser.id);
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
const updatedChannel = await updateChannel(jwtToken, creationResult.entity.id, {
is_default: true,
});
expect(updatedChannel).toMatchObject({
id: channel.id,
name: "Test Channel",
company_id: channel.company_id,
workspace_id: channel.workspace_id,
is_default: true,
visibility: channel.visibility,
archived: channel.archived,
owner: channel.owner,
});
done();
});
it("should be able to update the visibility field", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel(platform.currentUser.id);
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
const updatedChannel = await updateChannel(jwtToken, creationResult.entity.id, {
visibility: ChannelVisibility.PUBLIC,
});
expect(updatedChannel).toMatchObject({
id: channel.id,
name: "Test Channel",
company_id: channel.company_id,
workspace_id: channel.workspace_id,
is_default: channel.is_default,
visibility: ChannelVisibility.PUBLIC,
archived: channel.archived,
owner: channel.owner,
});
done();
});
it("should be able to update the archived field", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel(platform.currentUser.id);
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
const updatedChannel = await updateChannel(jwtToken, creationResult.entity.id, {
archived: true,
});
expect(updatedChannel).toMatchObject({
id: channel.id,
name: "Test Channel",
company_id: channel.company_id,
workspace_id: channel.workspace_id,
is_default: channel.is_default,
visibility: channel.visibility,
archived: true,
owner: channel.owner,
});
done();
});
it("should be able to update all the fields at the same time", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel(platform.currentUser.id);
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
const updatedChannel = await updateChannel(jwtToken, creationResult.entity.id, {
visibility: ChannelVisibility.PUBLIC,
is_default: true,
archived: true,
});
expect(updatedChannel).toMatchObject({
id: channel.id,
name: "Test Channel",
company_id: channel.company_id,
workspace_id: channel.workspace_id,
is_default: true,
visibility: ChannelVisibility.PUBLIC,
archived: true,
owner: channel.owner,
});
done();
});
});
describe("When user is 'standard' user and is not channel owner", () => {
beforeEach(() => {
platform.currentUser.isWorkspaceModerator = false;
});
it("should not be able to update the is_default field", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
await updateChannelFail(
jwtToken,
creationResult.entity.id,
{
is_default: true,
},
400,
);
done();
});
it("should not be able to update the visibility field", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
await updateChannelFail(
jwtToken,
creationResult.entity.id,
{
visibility: ChannelVisibility.PUBLIC,
},
400,
);
done();
});
it("should not be able to update the archived field", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
await updateChannelFail(
jwtToken,
creationResult.entity.id,
{
archived: true,
},
400,
);
done();
});
it("should be able to update the 'name', 'description', 'icon' fields", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
const updatedChannel = await updateChannel(jwtToken, creationResult.entity.id, {
name: "This is a new name",
description: "This is a new description",
icon: "This is a new icon",
});
expect(updatedChannel).toMatchObject({
id: channel.id,
name: "This is a new name",
description: "This is a new description",
icon: "This is a new icon",
company_id: channel.company_id,
workspace_id: channel.workspace_id,
is_default: channel.is_default,
visibility: channel.visibility,
archived: channel.archived,
owner: channel.owner,
});
done();
});
});
});
describe.skip("The DELETE /companies/:companyId/workspaces/:workspaceId/channels/:id route", () => {
async function expectDeleteResult(
jwtToken: string,
url: string,
status: number,
): Promise<void> {
const response = await platform.app.inject({
method: "DELETE",
url,
headers: {
authorization: `Bearer ${jwtToken}`,
},
});
expect(response.statusCode).toEqual(status);
}
it("should 400 when companyId is not valid", async done => {
testAccess(
`${url}/companies/123/workspaces/${platform.workspace.workspace_id}/channels/1`,
"DELETE",
done,
);
});
it("should 400 when workspaceId is not valid", async done => {
testAccess(
`${url}/companies/${platform.workspace.company_id}/workspaces/123/channels/1`,
"DELETE",
done,
);
});
describe("When user is workspace moderator", () => {
beforeEach(() => {
platform.currentUser.isWorkspaceModerator = true;
});
it("should not be able to delete a direct channel", async done => {
platform.workspace.workspace_id = "direct";
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
await expectDeleteResult(
jwtToken,
`${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels/${creationResult.entity.id}`,
400,
);
done();
});
it("should be able to delete any channel of the workspace", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
await expectDeleteResult(
jwtToken,
`${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels/${creationResult.entity.id}`,
204,
);
done();
});
});
describe("When user is channel owner", () => {
beforeEach(() => {
platform.currentUser.isWorkspaceModerator = false;
});
it("should not be able to delete a direct channel", async done => {
platform.workspace.workspace_id = "direct";
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel(platform.currentUser.id);
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
await expectDeleteResult(
jwtToken,
`${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels/${creationResult.entity.id}`,
400,
);
done();
});
it("should be able to delete the channel", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel(platform.currentUser.id);
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
await expectDeleteResult(
jwtToken,
`${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels/${creationResult.entity.id}`,
204,
);
done();
});
});
describe("When user is not creator nor workspace moderator", () => {
beforeEach(() => {
platform.currentUser.isWorkspaceModerator = false;
});
it("should not be able to delete the channel", async done => {
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
await expectDeleteResult(
jwtToken,
`${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels/${creationResult.entity.id}`,
400,
);
done();
});
it("should not be able to delete a direct channel", async done => {
platform.workspace.workspace_id = "direct";
const jwtToken = await platform.auth.getJWTToken();
const channel = getChannel();
const creationResult = await gr.services.channels.channels.save(
channel,
{},
getContext({ id: channel.owner }),
);
await expectDeleteResult(
jwtToken,
`${url}/companies/${platform.workspace.company_id}/workspaces/${platform.workspace.workspace_id}/channels/${creationResult.entity.id}`,
400,
);
done();
});
});
});
describe("The GET /companies/:companyId/workspaces/:workspaceId/recent route", () => {
it("should return list of recent channels for workspace", async done => {
await testDbService.createDefault(platform);
const channels = [];
for (let i = 0; i < 5; i++) {
const channel = new Channel();
channel.name = `Regular Channel ${i}`;
channel.visibility = ChannelVisibility.PUBLIC;
const creationResult = await gr.services.channels.channels.save(channel, {}, getContext());
channels.push(creationResult.entity);
}
for (let i = 0; i < 5; i++) {
// const channel = channelUtils.getChannel();
const directChannelIn = channelUtils.getDirectChannel();
const nextUser = await testDbService.createUser(
[{ id: platform.workspace.workspace_id, company_id: platform.workspace.company_id }],
{ firstName: "FirstName" + i, lastName: "LastName" + i },
);
const members = [platform.currentUser.id, nextUser.id];
const directWorkspace: Workspace = {
company_id: platform.workspace.company_id,
workspace_id: ChannelVisibility.DIRECT,
};
await Promise.all([
// gr.services.channels.channels.save(channel, {}, getContext()),
gr.services.channels.channels.save(
directChannelIn,
{
members,
},
{ ...getContext(), ...{ workspace: directWorkspace } },
),
]);
channels.push(directChannelIn);
}
await new Promise(resolve => setTimeout(resolve, 2000));
console.log("done awaiting");
await e2e_createThread(
platform,
[
{
company_id: platform.workspace.company_id,
created_at: 0,
created_by: "",
id: channels[2].id,
type: "channel",
workspace_id: platform.workspace.workspace_id,
},
],
createMessage({ text: "Initial thread message for regular channel" }),
);
await e2e_createThread(
platform,
[
{
company_id: platform.workspace.company_id,
created_at: 0,
created_by: "",
id: channels[7].id,
type: "channel",
workspace_id: "direct",
},
],
createMessage({ text: "Some message" }),
);
await gr.services.channels.channels.markAsRead(channels[2], { id: platform.currentUser.id });
await gr.services.channels.channels.markAsRead(channels[7], { id: platform.currentUser.id });
await new Promise(resolve => setTimeout(resolve, 2000));
const jwtToken = await platform.auth.getJWTToken();
const response = await platform.app.inject({
method: "GET",
url: `${url}/companies/${platform.workspace.company_id}/channels/recent`,
headers: {
authorization: `Bearer ${jwtToken}`,
},
});
expect(response.statusCode).toBe(200);
const result: ResourceListResponse<ChannelObject> = deserialize(
ResourceListResponse,
response.body,
);
console.log(result.resources[0]);
console.log(result.resources.map(a => `${a.name}${a.last_activity}`));
expect(result.resources.length).toEqual(10);
expect(result.resources[0].name).toEqual("FirstName2 LastName2");
expect(result.resources[1].name).toEqual("Regular Channel 2");
done();
});
});
});