Less Test Errors 1

This commit is contained in:
ADAMJR 2021-08-26 12:47:46 +01:00
parent d7e2604851
commit 96e100497c
42 changed files with 1714 additions and 1211 deletions

2608
backend/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -65,7 +65,7 @@
"@types/passport": "^1.0.4",
"@types/passport-local": "^1.0.33",
"@types/socket.io": "^2.1.13",
"@types/socket.io-client": "^1.4.36",
"@types/socket.io-client": "^3.0.0",
"@types/supertest": "^2.0.10",
"chai": "^4.2.0",
"chai-as-promised": "^7.1.1",

View File

@ -2,7 +2,7 @@ import { config } from 'dotenv';
config();
import { connect } from 'mongoose';
import { API } from './rest/server';
import { REST } from './rest/server';
import Deps from './utils/deps';
import Log from './utils/log';
@ -17,4 +17,4 @@ connect(process.env.MONGO_URI, {
: Log.info('Connected to database.')
);
Deps.get<API>(API);
Deps.get<REST>(REST);

View File

@ -20,16 +20,14 @@ export default class GuildMembers extends DBWrapper<string, GuildMemberDocument>
return member;
}
public async create(guild: GuildDocument, user: SelfUserDocument, ...roles: Entity.Role[]) {
public async create(guildId: string, user: SelfUserDocument, ...roleIds: string[] = []) {
const member = await GuildMember.create({
_id: generateSnowflake(),
guildId: guild.id,
guildId: guildId,
userId: user.id,
roleIds: (roles.length > 0)
? roles.map(r => r.id)
: [await this.getEveryoneRoleId(guild.id) as string],
roleIds: [await this.getEveryoneRoleId(guildId)].concat(roleIds),
});
await this.addToUser(user, guild.id);
await this.addToUser(user, guildId);
return member;
}
@ -41,6 +39,6 @@ export default class GuildMembers extends DBWrapper<string, GuildMemberDocument>
private async getEveryoneRoleId(guildId: string) {
const role = await Role.findOne({ guildId, name: '@everyone' });
return role?.id;
return role!.id;
}
}

View File

@ -40,7 +40,7 @@ export default class Guilds extends DBWrapper<string, GuildDocument> {
});
const everyoneRole = await this.roles.create(guild.id, { name: '@everyone' });
await this.channels.createText(guild.id);
await this.members.create(guild, owner, everyoneRole);
await this.members.create(guild.id, owner, everyoneRole);
return guild;
}

View File

@ -13,18 +13,13 @@ export default class Invites extends DBWrapper<string, InviteDocument> {
return invite;
}
public async create({ guildId, options }: WS.Params.InviteCreate, userId: string) {
const invite = await Invite.create({
public async create({ guildId, options }: WS.Params.InviteCreate, inviterId: string) {
return await Invite.create({
_id: generateInvite(),
guildId,
inviterId: userId,
inviterId,
options,
uses: 0,
});
await Guild.updateOne(
{ _id: guildId },
{ $push: { invites: invite } }
);
return invite;
}
}

View File

@ -7,7 +7,6 @@ import { generateSnowflake } from '../snowflake-entity';
export interface GuildDocument extends Document, Entity.Guild {
id: string;
createdAt: never;
nameAcronym: never;
}
export const Guild = model<GuildDocument>('guild', new Schema({

View File

@ -1,4 +1,4 @@
import Deps from '../../../utils/deps';
import Deps from '../utils/deps';
import { Email } from './email';
import { Verification } from './verification';

View File

@ -1,7 +1,7 @@
import { createTransport } from 'nodemailer';
import Mail from 'nodemailer/lib/mailer';
import { pugEngine } from 'nodemailer-pug-engine';
import Log from '../../../utils/log';
import Log from '../utils/log';
export class Email {
private email: Mail;

View File

@ -1,4 +1,4 @@
import generateInvite from '../../../data/utils/generate-invite';
import generateInvite from '../data/utils/generate-invite';
export class Verification {
private codes = new Map<string, VerifyCode>();

View File

@ -27,7 +27,7 @@ router.get('/:id/authorize/:botId',
async (req, res) => {
const guild = res.locals.guild;
const bot = await users.get(req.params.botId);
const member = await members.create(guild, bot);
const member = await members.create(guild.id, bot);
ws.io
.to(guild.id)

View File

@ -19,7 +19,7 @@ import { WebSocket } from '../ws/websocket';
import { APIError } from './modules/api-error';
import rateLimiter from './modules/rate-limiter';
export class API {
export class REST {
public app = express();
private prefix = `/api/v2`;

View File

@ -38,7 +38,7 @@ export default class implements WSEvent<'GUILD_MEMBER_ADD'> {
const [a, b, member, entities] = await Promise.all([
this.handleInvite(invite),
this.rooms.joinGuildRooms(user, client),
this.members.create(guild, user),
this.members.create(guild.id, user),
this.guilds.getEntities(guild.id),
]);
client.emit('GUILD_CREATE', { guild, ...entities, } as WS.Args.GuildCreate);

View File

@ -1,44 +0,0 @@
import SendFriendRequest from '../../src/api/websocket/ws-events/send-friend-request';
import { WebSocket } from '../../src/api/websocket/websocket';
import io from 'socket.io-client';
import { Mock } from '../mock';
import { UserDocument } from '../../src/data/models/user';
import { GuildDocument } from '../../src/data/models/guild';
import { expect } from 'chai';
describe(addeventnamehere, () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
let event: SendFriendRequest;
let ws: WebSocket;
let user: UserDocument;
let guild: GuildDocument;
beforeEach(async () => {
({ event, ws, guild, user } = await Mock.defaultSetup(client, SendFriendRequest));
});
afterEach(async () => await Mock.afterEach(ws));
after(async () => await Mock.after(client));
it('fulfilled', async () => {
const result = () => event.invoke(ws, client, {
});
await expect(result()).to.be.fulfilled;
});
it('rejected', async () => {
const result = () => event.invoke(ws, client, {
});
await expect(result()).to.be.rejectedWith();
});
async function makeGuildOwner() {
ws.sessions.set(client.id, guild.ownerId);
await Mock.clearRolePerms(guild);
}
});

View File

@ -2,13 +2,11 @@ import { Mock } from '../../mock/mock';
import { EmailMock } from '../../mock/email-mock';
import { assert, expect, spy } from 'chai';
import Deps from '../../../src/utils/deps';
import { API } from '../../../src/api/server';
import request from 'supertest';
import Users from '../../../src/data/users';
import { User, SelfUserDocument } from '../../../src/data/models/user';
import { generateUsername } from '../../../src/utils/utils';
import { generateInviteCode } from '../../../src/data/models/invite';
import { Email } from '../../../src/api/modules/email/email';
import { REST } from '../../../src/rest/server';
describe.skip('auth-routes', () => {
const endpoint = `/api/v1`;
@ -23,7 +21,7 @@ describe.skip('auth-routes', () => {
beforeEach(async () => {
email = Deps.add(Email, new EmailMock());
app = Deps.get<API>(API).app;
app = Deps.get<REST>(REST).app;
users = Deps.get<Users>(Users);
credentials = {

View File

@ -1,6 +1,6 @@
import AddFriend from '../../../src/api/websocket/ws-events/add-friend';
import RemoveFriend from '../../../src/api/websocket/ws-events/remove-friend';
import { WebSocket } from '../../../src/api/websocket/websocket';
import AddFriend from '../../../src/ws/ws-events/add-friend';
import RemoveFriend from '../../../src/ws/ws-events/remove-friend';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import { Mock } from '../../mock/mock';
import { expect } from 'chai';
@ -8,7 +8,7 @@ import { SelfUserDocument, User } from '../../../src/data/models/user';
import { Channel } from '../../../src/data/models/channel';
describe('add-friend', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: AddFriend;
let ws: WebSocket;

View File

@ -1,13 +1,14 @@
import { WebSocket } from '../../../src/api/websocket/websocket';
import 'mocha';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import ChannelCreate from '../../../src/api/websocket/ws-events/channel-create';
import ChannelCreate from '../../../src/ws/ws-events/channel-create';
import { Mock } from '../../mock/mock';
import { expect, spy } from 'chai';
import { Guild, GuildDocument } from '../../../src/data/models/guild';
import { RoleDocument } from '../../../src/data/models/role';
describe('channel-create', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let ws: WebSocket;
let event: ChannelCreate;

View File

@ -1,13 +1,13 @@
import { WebSocket } from '../../../src/api/websocket/websocket';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import GuildCreate from '../../../src/api/websocket/ws-events/guild-create';
import GuildCreate from '../../../src/ws/ws-events/guild-create';
import { User, UserDocument } from '../../../src/data/models/user';
import { Mock } from '../../mock/mock';
import { expect } from 'chai';
import { GuildMemberDocument } from '../../../src/data/models/guild-member';
describe('guild-create', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let ws: WebSocket;
let event: GuildCreate;

View File

@ -1,6 +1,6 @@
import { WebSocket } from '../../../src/api/websocket/websocket';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import GuildDelete from '../../../src/api/websocket/ws-events/guild-delete';
import GuildDelete from '../../../src/ws/ws-events/guild-delete';
import { User, UserDocument } from '../../../src/data/models/user';
import { Mock } from '../../mock/mock';
import { expect } from 'chai';
@ -11,7 +11,7 @@ import { Invite } from '../../../src/data/models/invite';
import { Role } from '../../../src/data/models/role';
describe('guild-delete', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let ws: WebSocket;
let event: GuildDelete;

View File

@ -1,5 +1,5 @@
import GuildMemberAdd from '../../../src/api/websocket/ws-events/guild-member-add';
import { WebSocket } from '../../../src/api/websocket/websocket';
import GuildMemberAdd from '../../../src/ws/ws-events/guild-member-add';
import { WebSocket } from '../../../src/ws/websocket';
import Deps from '../../../src/utils/deps';
import io from 'socket.io-client';
import { Mock } from '../../mock/mock';
@ -11,7 +11,7 @@ import Guilds from '../../../src/data/guilds';
import Users from '../../../src/data/users';
describe('guild-member-add', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: GuildMemberAdd;
let guilds: Guilds;
let users: Users;

View File

@ -1,5 +1,5 @@
import GuildMemberRemove from '../../../src/api/websocket/ws-events/guild-member-remove';
import { WebSocket } from '../../../src/api/websocket/websocket';
import GuildMemberRemove from '../../../src/ws/ws-events/guild-member-remove';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import { Mock } from '../../mock/mock';
import { GuildDocument } from '../../../src/data/models/guild';
@ -8,7 +8,7 @@ import { GuildMemberDocument } from '../../../src/data/models/guild-member';
import { User, UserDocument } from '../../../src/data/models/user';
describe('guild-member-remove', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: GuildMemberRemove;
let ws: WebSocket;

View File

@ -1,5 +1,5 @@
import GuildMemberUpdate from '../../../src/api/websocket/ws-events/guild-member-update';
import { WebSocket } from '../../../src/api/websocket/websocket';
import GuildMemberUpdate from '../../../src/ws/ws-events/guild-member-update';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import { Mock } from '../../mock/mock';
import { GuildDocument } from '../../../src/data/models/guild';
@ -8,7 +8,7 @@ import { GuildMember, GuildMemberDocument } from '../../../src/data/models/guild
import { Role, RoleDocument } from '../../../src/data/models/role';
describe('guild-member-update', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: GuildMemberUpdate;
let ws: WebSocket;

View File

@ -1,6 +1,6 @@
import { WebSocket } from '../../../src/api/websocket/websocket';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import GuildUpdate from '../../../src/api/websocket/ws-events/guild-update';
import GuildUpdate from '../../../src/ws/ws-events/guild-update';
import { Guild, GuildDocument } from '../../../src/data/models/guild';
import { UserDocument } from '../../../src/data/models/user';
import { Mock } from '../../mock/mock';
@ -9,7 +9,7 @@ import { GuildMemberDocument } from '../../../src/data/models/guild-member';
import { generateSnowflake } from '../../../src/data/snowflake-entity';
describe('guild-update', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let ws: WebSocket;
let event: GuildUpdate;

View File

@ -1,5 +1,5 @@
import InviteCreate from '../../../src/api/websocket/ws-events/invite-create';
import { WebSocket } from '../../../src/api/websocket/websocket';
import InviteCreate from '../../../src/ws/ws-events/invite-create';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import { Mock } from '../../mock/mock';
import { GuildDocument } from '../../../src/data/models/guild';
@ -7,7 +7,7 @@ import { expect } from 'chai';
import { Role, RoleDocument } from '../../../src/data/models/role';
describe('invite-create', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: InviteCreate;
let ws: WebSocket;

View File

@ -1,5 +1,5 @@
import InviteDelete from '../../../src/api/websocket/ws-events/invite-delete';
import { WebSocket } from '../../../src/api/websocket/websocket';
import InviteDelete from '../../../src/ws/ws-events/invite-delete';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import { Mock } from '../../mock/mock';
import { GuildDocument } from '../../../src/data/models/guild';
@ -8,7 +8,7 @@ import { expect } from 'chai';
import { RoleDocument } from '../../../src/data/models/role';
describe('invite-delete', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: InviteDelete;
let ws: WebSocket;

View File

@ -1,5 +1,5 @@
import MessageCreate from '../../../src/api/websocket/ws-events/message-create';
import { WebSocket } from '../../../src/api/websocket/websocket';
import MessageCreate from '../../../src/ws/ws-events/message-create';
import { WebSocket } from '../../../src/ws/websocket';
import { expect } from 'chai';
import io from 'socket.io-client';
import { Mock } from '../../mock/mock';
@ -8,7 +8,7 @@ import { Channel, ChannelDocument } from '../../../src/data/models/channel';
import { SelfUserDocument, User } from '../../../src/data/models/user';
describe('message-create', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: MessageCreate;
let ws: WebSocket;

View File

@ -1,5 +1,5 @@
import MessageDelete from '../../../src/api/websocket/ws-events/message-delete';
import { WebSocket } from '../../../src/api/websocket/websocket';
import MessageDelete from '../../../src/ws/ws-events/message-delete';
import { WebSocket } from '../../../src/ws/websocket';
import { expect } from 'chai';
import io from 'socket.io-client';
import { Mock } from '../../mock/mock';
@ -10,7 +10,7 @@ import { generateSnowflake } from '../../../src/data/snowflake-entity';
import { Channel } from '../../../src/data/models/channel';
describe('message-delete', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: MessageDelete;
let ws: WebSocket;

View File

@ -1,5 +1,5 @@
import MessageUpdate from '../../../src/api/websocket/ws-events/message-update';
import { WebSocket } from '../../../src/api/websocket/websocket';
import MessageUpdate from '../../../src/ws/ws-events/message-update';
import { WebSocket } from '../../../src/ws/websocket';
import Deps from '../../../src/utils/deps';
import { expect } from 'chai';
import io from 'socket.io-client';
@ -12,7 +12,7 @@ import { generateSnowflake } from '../../../src/data/snowflake-entity';
import { Partial } from '../../../src/data/types/ws-types';
describe('message-update', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let channel: ChannelDocument;
let event: MessageUpdate;

View File

@ -1,17 +1,17 @@
import Deps from '../../../src/utils/deps';
import Ready from '../../../src/api/websocket/ws-events/ready';
import Disconnect from '../../../src/api/websocket/ws-events/disconnect';
import Ready from '../../../src/ws/ws-events/ready';
import Disconnect from '../../../src/ws/ws-events/disconnect';
import { User, UserDocument } from '../../../src/data/models/user';
import { expect } from 'chai';
import Users from '../../../src/data/users';
import { Mock } from '../../mock/mock';
import { WebSocket } from '../../../src/api/websocket/websocket';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import { SystemBot } from '../../../src/system/bot';
import { GuildDocument } from '../../../src/data/models/guild';
describe('ready', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: Ready;
let users: Users;

View File

@ -1,5 +1,5 @@
import RemoveFriend from '../../../src/api/websocket/ws-events/remove-friend';
import { WebSocket } from '../../../src/api/websocket/websocket';
import RemoveFriend from '../../../src/ws/ws-events/remove-friend';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import { Mock } from '../../mock/mock';
import { expect } from 'chai';
@ -7,7 +7,7 @@ import { generateSnowflake } from '../../../src/data/snowflake-entity';
import { SelfUserDocument, User, UserDocument } from '../../../src/data/models/user';
describe('remove-friend', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: RemoveFriend;
let ws: WebSocket;

View File

@ -1,5 +1,5 @@
import UserUpdate from '../../../src/api/websocket/ws-events/user-update';
import { WebSocket } from '../../../src/api/websocket/websocket';
import UserUpdate from '../../../src/ws/ws-events/user-update';
import { WebSocket } from '../../../src/ws/websocket';
import io from 'socket.io-client';
import { Mock } from '../../mock/mock';
import { User, UserDocument } from '../../../src/data/models/user';
@ -8,7 +8,7 @@ import Deps from '../../../src/utils/deps';
import Users from '../../../src/data/users';
describe('user-update', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let event: UserUpdate;
let ws: WebSocket;

View File

@ -5,13 +5,13 @@ import { GuildDocument } from '../../../src/data/models/guild';
import { UserDocument } from '../../../src/data/models/user';
import { WSGuard } from '../../../src/api/modules/ws-guard';
import { expect } from 'chai';
import { WebSocket } from '../../../src/api/websocket/websocket';
import { WebSocket } from '../../../src/ws/websocket';
import { GuildMember } from '../../../src/data/models/guild-member';
import { Role } from '../../../src/data/models/role';
import { TextChannelDocument, VoiceChannelDocument } from '../../../src/data/models/channel';
describe('ws-guard', () => {
const client = io(`http://localhost:${process.env.PORT}`) as any;
const client = (io as any)(`http://localhost:${process.env.PORT}`) as any;
let guard: WSGuard;
let guild: GuildDocument;

View File

@ -4,37 +4,46 @@ import { GuildMember, GuildMemberDocument } from '../../src/data/models/guild-me
import { User, SelfUserDocument, UserDocument } from '../../src/data/models/user';
import { generateSnowflake } from '../../src/data/snowflake-entity';
import { Role, RoleDocument } from '../../src/data/models/role';
import { ChannelTypes, InviteTypes, Lean, PermissionTypes, UserTypes } from '../../src/data/types/entity-types';
import { Message } from '../../src/data/models/message';
import { Invite } from '../../src/data/models/invite';
import Roles from '../../src/data/roles';
import Messages from '../../src/data/messages';
import Invites from '../../src/data/invites';
import { Application } from '../../src/data/models/application';
import { API } from '../../src/api/server';
import { WebSocket } from '../../src/api/websocket/websocket';
import { WebSocket } from '../../src/ws/websocket';
import Deps from '../../src/utils/deps';
import Guilds from '../../src/data/guilds';
import GuildMembers from '../../src/data/guild-members';
import Channels from '../../src/data/channels';
import { PermissionTypes } from '../../src/types/permission-types';
import { REST } from '../../src/rest/server';
import { PartialEntity } from '../../src/types/ws';
// mostly replace will data wrappers
// TODO: mostly replace with data wrappers
export class Mock {
private static channels = Deps.get<Channels>(Channels);
private static guilds = Deps.get<Guilds>(Guilds);
private static guildMembers = Deps.get<GuildMembers>(GuildMembers);
private static messages = Deps.get<Messages>(Messages);
private static roles = Deps.get<Roles>(Roles);
public static async defaultSetup(client: any, eventType: any = function() {}) {
Deps.get<API>(API);
Deps.get<REST>(REST);
const event = new (eventType as any)();
const ws = Deps.get<WebSocket>(WebSocket);
const guild = await Mock.guild();
const member = new GuildMember(guild.members[1]);
const role = new Role(guild.roles[0]);
const user = await User.findById(member.userId);
const channel = new Channel(guild.channels[0]);
const guild = await this.guild();
const guildId = guild.id;
const [user, member, role, channel] = await Promise.all([
User.findOne({ guildIds: { $in: guild.id } }),
GuildMember.findOne({ _id: { $not: guild.ownerId }, guildId }),
Role.findOne({ guildId }),
Channel.findOne({ guildId }),
]);
Mock.ioClient(client);
ws.sessions.set(client.id, user.id);
return { event, guild, user, member, ws, role, channel };
@ -59,25 +68,20 @@ export class Mock {
};
}
public static async message(author: Lean.User, channelId: string) {
return await Message.create({
_id: generateSnowflake(),
authorId: author.id,
channelId,
content: 'hi',
public static async message(author: Entity.User, channelId: string, options?: PartialEntity.Message) {
return await this.messages.create(author.id, channelId, {
content: 'testing123',
...options,
});
}
public static async guild(): Promise<GuildDocument> {
const owner = await Mock.user();
const memberUser = await Mock.user();
const owner = await Mock.self();
const memberUser = await Mock.self();
const guild = await this.guilds.create('Mock Guild', owner);
const guild = await this.guilds.create('Mock Guild', owner);
await this.guildMembers.create(guild.id, memberUser);
owner.guilds.push(guild.id as any);
await owner.save();
await this.guildMembers.create(guild, memberUser, guild.roles[0] as any);
return guild;
}
@ -87,11 +91,9 @@ export class Mock {
avatarURL: 'a',
bot: false,
badges: [],
friendIds: [],
friendRequestIds: [],
email: `${generateSnowflake()}@gmail.com`,
verified: true,
guilds: guildIds,
guildIds,
status: 'OFFLINE',
username: `mock-user-${generateSnowflake()}`,
} as any);
@ -109,41 +111,21 @@ export class Mock {
badges: [],
friendIds: [],
friendRequestIds: [],
email: `${generateSnowflake()}@gmail.com`, // FIXME
guilds: guildIds,
email: `${generateSnowflake()}@gmail.com`,
guildIds,
status: 'ONLINE',
username: `mock-bot-${generateSnowflake()}`,
} as any) as SelfUserDocument;
}
public static async guildMember(user: UserDocument, guild: GuildDocument): Promise<GuildMemberDocument> {
return await this.guildMembers.create(guild, user);
public static guildMember(user: SelfUserDocument, guild: GuildDocument): Promise<GuildMemberDocument> {
return this.guildMembers.create(guild.id, user);
}
public static async channel(options?: Partial<Lean.Channel>): Promise<ChannelDocument> {
const channel = await this.channels.create(options);
if (options?.guildId) {
const guild = await Guild.findById(options.guildId);
guild.channels.push(channel);
await guild.save();
}
return channel;
public static channel(options?: Partial<Entity.Channel>): Promise<ChannelDocument> {
return this.channels.create(options);
}
public static async role(guild: GuildDocument, permissions?: number): Promise<RoleDocument> {
const role = await Role.create({
_id: generateSnowflake(),
guildId: guild.id,
hoisted: false,
mentionable: true,
name: 'Mock Role',
permissions: permissions ?? PermissionTypes.defaultPermissions,
});
guild.roles.push(role.id as any);
await guild.save();
return role;
public static role(guild: GuildDocument, permissions?: number): Promise<RoleDocument> {
return this.roles.create(guild.id, { permissions });
}
public static async everyoneRole(guildId: string, permissions = PermissionTypes.defaultPermissions) {
@ -157,17 +139,14 @@ export class Mock {
});
}
public static async invite(guildId: string, options?: InviteTypes.Options) {
return await Invite.create({
_id: generateSnowflake(),
inviterId: generateSnowflake(),
public static invite(guildId: string, options?: InviteTypes.Options) {
return this.invites.create({
options,
guildId,
uses: 0,
});
}
public static async clearRolePerms(guild: Lean.Guild) {
public static async clearRolePerms(guild: Entity.Guild) {
await Role.updateOne(
{ _id: guild.roles?.[0].id },
{ permissions: 0 },
@ -179,9 +158,9 @@ export class Mock {
await role.save();
}
public static async giveEveryoneAdmin(guild: Lean.Guild) {
public static async giveEveryoneAdmin(guild: Entity.Guild) {
await Role.updateOne(
{ _id: guild.roles[0].id },
{ guildId: guild.id },
{ permissions: PermissionTypes.General.ADMINISTRATOR },
);
}

View File

@ -8,7 +8,7 @@ export function longArray(length: number) {
}
export function mongooseError(error: any): string | boolean {
if (error) {
const token = Object.keys(error.errors)[0];
const key = Object.keys(error.errors)[0];
return error?.errors[key].message;
}
return true;

View File

@ -1,3 +1,4 @@
import 'mocha';
import { config } from 'dotenv';
import { execSync } from 'child_process';
config({ path: 'test/.env' });
@ -26,10 +27,11 @@ use(should);
execSync(`kill -9 $(lsof -i :${process.env.PORT} | tail -n 1 | cut -d ' ' -f5)`);
} catch {}
// disabled due to impracticality
// await import('./integration/routes/auth-routes.tests');
await import('./integration/routes/invites-routes.tests');
await import('./integration/routes/guilds-routes.tests');
await import('./integration/routes/channel-routes.tests');
// await import('./integration/routes/invites-routes.tests');
// await import('./integration/routes/guilds-routes.tests');
// await import('./integration/routes/channel-routes.tests');
await import('./integration/ws/channel-create.tests');
await import('./integration/ws/guild-member-add.tests');

View File

@ -1,5 +1,5 @@
import { expect } from 'chai';
import { WSCooldowns } from '../../../src/api/websocket/modules/ws-cooldowns';
import { WSCooldowns } from '../../../src/ws/modules/ws-cooldowns';
import { generateInviteCode } from '../../../src/data/models/invite';
describe('ws-cooldowns', () => {

1
types/ws.d.ts vendored
View File

@ -351,6 +351,7 @@ declare namespace WS {
* Some properties (e.g. id) cannot be updated.
*
* **Tip**: Only provide what properties are being updated. */
// TODO: replace with Partial?
export namespace PartialEntity {
export type Application = Partial<Entity.App>;
export type Channel = Partial<Entity.Channel>;