mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 10:02:05 +00:00
🚨 Optimize UM tests (#3066)
* ⚡ Declutter test logs * 🐛 Fix random passwords length * 🐛 Fix password hashing in test user creation * 🐛 Hash leftover password * ⚡ Improve error message for `compare` * ⚡ Restore `randomInvalidPassword` contant * ⚡ Mock Telemetry module to prevent `--forceExit` * 🔥 Remove unused imports * 🔥 Remove unused import * ⚡ Add util for configuring test SMTP * ⚡ Isolate user creation * 🔥 De-duplicate `createFullUser` * ⚡ Centralize hashing * 🔥 Remove superfluous arg * 🔥 Remove outdated comment * ⚡ Prioritize shared tables during trucation * 🧪 Add login tests * ⚡ Use token helper * ✏️ Improve naming * ⚡ Make `createMemberShell` consistent * 🔥 Remove unneeded helper * 🔥 De-duplicate `beforeEach` * ✏️ Improve naming * 🚚 Move `categorize` to utils * ✏️ Update comment * 🧪 Simplify test * 📘 Improve `User.password` type * ⚡ Silence logger * ⚡ Simplify condition * ⚡ Unhash password in payload * 🐛 Fix comparison against unhashed password * ⚡ Increase timeout for fake SMTP service * 🔥 Remove unneeded import * ⚡ Use `isNull()` * 🧪 Use `Promise.all()` in creds tests * 🧪 Use `Promise.all()` in me tests * 🧪 Use `Promise.all()` in owner tests * 🧪 Use `Promise.all()` in password tests * 🧪 Use `Promise.all()` in users tests * ⚡ Re-set cookie if UM disabled * 🔥 Remove repeated line * ⚡ Refactor out shared owner data * 🔥 Remove unneeded import * 🔥 Remove repeated lines * ⚡ Organize imports * ⚡ Reuse helper * 🚚 Rename tests to match routers * 🚚 Rename `createFullUser()` to `createUser()` * ⚡ Consolidate user shell creation * ⚡ Make hashing async * ⚡ Add email to user shell * ⚡ Optimize array building * 🛠 refactor user shell factory * 🐛 Fix MySQL tests * ⚡ Silence logger in other DBs Co-authored-by: Ben Hesseldieck <b.hesseldieck@gmail.com>
This commit is contained in:
@@ -4,14 +4,17 @@ import { Db } from '../../src';
|
||||
import { randomName, randomString } from './shared/random';
|
||||
import * as utils from './shared/utils';
|
||||
import type { CredentialPayload, SaveCredentialFunction } from './shared/types';
|
||||
import { Role } from '../../src/databases/entities/Role';
|
||||
import { User } from '../../src/databases/entities/User';
|
||||
import type { Role } from '../../src/databases/entities/Role';
|
||||
import type { User } from '../../src/databases/entities/User';
|
||||
import * as testDb from './shared/testDb';
|
||||
import { CredentialsEntity } from '../../src/databases/entities/CredentialsEntity';
|
||||
|
||||
jest.mock('../../src/telemetry');
|
||||
|
||||
let app: express.Application;
|
||||
let testDbName = '';
|
||||
let globalOwnerRole: Role;
|
||||
let globalMemberRole: Role;
|
||||
let saveCredential: SaveCredentialFunction;
|
||||
|
||||
beforeAll(async () => {
|
||||
@@ -24,19 +27,17 @@ beforeAll(async () => {
|
||||
|
||||
utils.initConfigFile();
|
||||
|
||||
globalOwnerRole = await testDb.getGlobalOwnerRole();
|
||||
globalMemberRole = await testDb.getGlobalMemberRole();
|
||||
const credentialOwnerRole = await testDb.getCredentialOwnerRole();
|
||||
saveCredential = affixRoleToSaveCredential(credentialOwnerRole);
|
||||
|
||||
utils.initTestLogger();
|
||||
utils.initTestTelemetry();
|
||||
});
|
||||
|
||||
beforeEach(async () => {
|
||||
await testDb.createOwnerShell();
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
// do not combine calls - shared table must be cleared first and separately
|
||||
await testDb.truncate(['SharedCredentials'], testDbName);
|
||||
await testDb.truncate(['User', 'Credentials'], testDbName);
|
||||
await testDb.truncate(['User', 'SharedCredentials', 'Credentials'], testDbName);
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
@@ -44,8 +45,9 @@ afterAll(async () => {
|
||||
});
|
||||
|
||||
test('POST /credentials should create cred', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
const payload = credentialPayload();
|
||||
|
||||
const response = await authOwnerAgent.post('/credentials').send(payload);
|
||||
@@ -71,26 +73,28 @@ test('POST /credentials should create cred', async () => {
|
||||
where: { credentials: credential },
|
||||
});
|
||||
|
||||
expect(sharedCredential.user.id).toBe(owner.id);
|
||||
expect(sharedCredential.user.id).toBe(ownerShell.id);
|
||||
expect(sharedCredential.credentials.name).toBe(payload.name);
|
||||
});
|
||||
|
||||
test('POST /credentials should fail with invalid inputs', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
|
||||
for (const invalidPayload of INVALID_PAYLOADS) {
|
||||
const response = await authOwnerAgent.post('/credentials').send(invalidPayload);
|
||||
expect(response.statusCode).toBe(400);
|
||||
}
|
||||
await Promise.all(
|
||||
INVALID_PAYLOADS.map(async (invalidPayload) => {
|
||||
const response = await authOwnerAgent.post('/credentials').send(invalidPayload);
|
||||
expect(response.statusCode).toBe(400);
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
test('POST /credentials should fail with missing encryption key', async () => {
|
||||
const mock = jest.spyOn(UserSettings, 'getEncryptionKey');
|
||||
mock.mockResolvedValue(undefined);
|
||||
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
|
||||
const response = await authOwnerAgent.post('/credentials').send(credentialPayload());
|
||||
|
||||
@@ -100,8 +104,8 @@ test('POST /credentials should fail with missing encryption key', async () => {
|
||||
});
|
||||
|
||||
test('POST /credentials should ignore ID in payload', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
|
||||
const firstResponse = await authOwnerAgent
|
||||
.post('/credentials')
|
||||
@@ -117,9 +121,9 @@ test('POST /credentials should ignore ID in payload', async () => {
|
||||
});
|
||||
|
||||
test('DELETE /credentials/:id should delete owned cred for owner', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: ownerShell });
|
||||
|
||||
const response = await authOwnerAgent.delete(`/credentials/${savedCredential.id}`);
|
||||
|
||||
@@ -136,9 +140,9 @@ test('DELETE /credentials/:id should delete owned cred for owner', async () => {
|
||||
});
|
||||
|
||||
test('DELETE /credentials/:id should delete non-owned cred for owner', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const member = await testDb.createUser();
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: member });
|
||||
|
||||
const response = await authOwnerAgent.delete(`/credentials/${savedCredential.id}`);
|
||||
@@ -156,7 +160,7 @@ test('DELETE /credentials/:id should delete non-owned cred for owner', async ()
|
||||
});
|
||||
|
||||
test('DELETE /credentials/:id should delete owned cred for member', async () => {
|
||||
const member = await testDb.createUser();
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: member });
|
||||
|
||||
@@ -175,10 +179,10 @@ test('DELETE /credentials/:id should delete owned cred for member', async () =>
|
||||
});
|
||||
|
||||
test('DELETE /credentials/:id should not delete non-owned cred for member', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const member = await testDb.createUser();
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: ownerShell });
|
||||
|
||||
const response = await authMemberAgent.delete(`/credentials/${savedCredential.id}`);
|
||||
|
||||
@@ -194,8 +198,8 @@ test('DELETE /credentials/:id should not delete non-owned cred for member', asyn
|
||||
});
|
||||
|
||||
test('DELETE /credentials/:id should fail if cred not found', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
|
||||
const response = await authOwnerAgent.delete('/credentials/123');
|
||||
|
||||
@@ -203,9 +207,9 @@ test('DELETE /credentials/:id should fail if cred not found', async () => {
|
||||
});
|
||||
|
||||
test('PATCH /credentials/:id should update owned cred for owner', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: ownerShell });
|
||||
const patchPayload = credentialPayload();
|
||||
|
||||
const response = await authOwnerAgent
|
||||
@@ -237,9 +241,9 @@ test('PATCH /credentials/:id should update owned cred for owner', async () => {
|
||||
});
|
||||
|
||||
test('PATCH /credentials/:id should update non-owned cred for owner', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const member = await testDb.createUser();
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: member });
|
||||
const patchPayload = credentialPayload();
|
||||
|
||||
@@ -272,7 +276,7 @@ test('PATCH /credentials/:id should update non-owned cred for owner', async () =
|
||||
});
|
||||
|
||||
test('PATCH /credentials/:id should update owned cred for member', async () => {
|
||||
const member = await testDb.createUser();
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: member });
|
||||
const patchPayload = credentialPayload();
|
||||
@@ -306,10 +310,10 @@ test('PATCH /credentials/:id should update owned cred for member', async () => {
|
||||
});
|
||||
|
||||
test('PATCH /credentials/:id should not update non-owned cred for member', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const member = await testDb.createUser();
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: ownerShell });
|
||||
const patchPayload = credentialPayload();
|
||||
|
||||
const response = await authMemberAgent
|
||||
@@ -324,22 +328,24 @@ test('PATCH /credentials/:id should not update non-owned cred for member', async
|
||||
});
|
||||
|
||||
test('PATCH /credentials/:id should fail with invalid inputs', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: ownerShell });
|
||||
|
||||
for (const invalidPayload of INVALID_PAYLOADS) {
|
||||
const response = await authOwnerAgent
|
||||
.patch(`/credentials/${savedCredential.id}`)
|
||||
.send(invalidPayload);
|
||||
await Promise.all(
|
||||
INVALID_PAYLOADS.map(async (invalidPayload) => {
|
||||
const response = await authOwnerAgent
|
||||
.patch(`/credentials/${savedCredential.id}`)
|
||||
.send(invalidPayload);
|
||||
|
||||
expect(response.statusCode).toBe(400);
|
||||
}
|
||||
expect(response.statusCode).toBe(400);
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
test('PATCH /credentials/:id should fail if cred not found', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
|
||||
const response = await authOwnerAgent.patch('/credentials/123').send(credentialPayload());
|
||||
|
||||
@@ -350,8 +356,8 @@ test('PATCH /credentials/:id should fail with missing encryption key', async ()
|
||||
const mock = jest.spyOn(UserSettings, 'getEncryptionKey');
|
||||
mock.mockResolvedValue(undefined);
|
||||
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
|
||||
const response = await authOwnerAgent.post('/credentials').send(credentialPayload());
|
||||
|
||||
@@ -361,14 +367,14 @@ test('PATCH /credentials/:id should fail with missing encryption key', async ()
|
||||
});
|
||||
|
||||
test('GET /credentials should retrieve all creds for owner', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
|
||||
for (let i = 0; i < 3; i++) {
|
||||
await saveCredential(credentialPayload(), { user: owner });
|
||||
await saveCredential(credentialPayload(), { user: ownerShell });
|
||||
}
|
||||
|
||||
const member = await testDb.createUser();
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
|
||||
await saveCredential(credentialPayload(), { user: member });
|
||||
|
||||
@@ -377,18 +383,20 @@ test('GET /credentials should retrieve all creds for owner', async () => {
|
||||
expect(response.statusCode).toBe(200);
|
||||
expect(response.body.data.length).toBe(4); // 3 owner + 1 member
|
||||
|
||||
for (const credential of response.body.data) {
|
||||
const { name, type, nodesAccess, data: encryptedData } = credential;
|
||||
await Promise.all(
|
||||
response.body.data.map(async (credential: CredentialsEntity) => {
|
||||
const { name, type, nodesAccess, data: encryptedData } = credential;
|
||||
|
||||
expect(typeof name).toBe('string');
|
||||
expect(typeof type).toBe('string');
|
||||
expect(typeof nodesAccess[0].nodeType).toBe('string');
|
||||
expect(encryptedData).toBeUndefined();
|
||||
}
|
||||
expect(typeof name).toBe('string');
|
||||
expect(typeof type).toBe('string');
|
||||
expect(typeof nodesAccess[0].nodeType).toBe('string');
|
||||
expect(encryptedData).toBeUndefined();
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
test('GET /credentials should retrieve owned creds for member', async () => {
|
||||
const member = await testDb.createUser();
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
||||
|
||||
for (let i = 0; i < 3; i++) {
|
||||
@@ -400,23 +408,25 @@ test('GET /credentials should retrieve owned creds for member', async () => {
|
||||
expect(response.statusCode).toBe(200);
|
||||
expect(response.body.data.length).toBe(3);
|
||||
|
||||
for (const credential of response.body.data) {
|
||||
const { name, type, nodesAccess, data: encryptedData } = credential;
|
||||
await Promise.all(
|
||||
response.body.data.map(async (credential: CredentialsEntity) => {
|
||||
const { name, type, nodesAccess, data: encryptedData } = credential;
|
||||
|
||||
expect(typeof name).toBe('string');
|
||||
expect(typeof type).toBe('string');
|
||||
expect(typeof nodesAccess[0].nodeType).toBe('string');
|
||||
expect(encryptedData).toBeUndefined();
|
||||
}
|
||||
expect(typeof name).toBe('string');
|
||||
expect(typeof type).toBe('string');
|
||||
expect(typeof nodesAccess[0].nodeType).toBe('string');
|
||||
expect(encryptedData).toBeUndefined();
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
test('GET /credentials should not retrieve non-owned creds for member', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const member = await testDb.createUser();
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
||||
|
||||
for (let i = 0; i < 3; i++) {
|
||||
await saveCredential(credentialPayload(), { user: owner });
|
||||
await saveCredential(credentialPayload(), { user: ownerShell });
|
||||
}
|
||||
|
||||
const response = await authMemberAgent.get('/credentials');
|
||||
@@ -426,9 +436,9 @@ test('GET /credentials should not retrieve non-owned creds for member', async ()
|
||||
});
|
||||
|
||||
test('GET /credentials/:id should retrieve owned cred for owner', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: ownerShell });
|
||||
|
||||
const firstResponse = await authOwnerAgent.get(`/credentials/${savedCredential.id}`);
|
||||
|
||||
@@ -451,7 +461,7 @@ test('GET /credentials/:id should retrieve owned cred for owner', async () => {
|
||||
});
|
||||
|
||||
test('GET /credentials/:id should retrieve owned cred for member', async () => {
|
||||
const member = await testDb.createUser();
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: member });
|
||||
|
||||
@@ -477,10 +487,10 @@ test('GET /credentials/:id should retrieve owned cred for member', async () => {
|
||||
});
|
||||
|
||||
test('GET /credentials/:id should not retrieve non-owned cred for member', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const member = await testDb.createUser();
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const member = await testDb.createUser({ globalRole: globalMemberRole });
|
||||
const authMemberAgent = utils.createAgent(app, { auth: true, user: member });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: ownerShell });
|
||||
|
||||
const response = await authMemberAgent.get(`/credentials/${savedCredential.id}`);
|
||||
|
||||
@@ -489,9 +499,9 @@ test('GET /credentials/:id should not retrieve non-owned cred for member', async
|
||||
});
|
||||
|
||||
test('GET /credentials/:id should fail with missing encryption key', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authOwnerAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
const savedCredential = await saveCredential(credentialPayload(), { user: ownerShell });
|
||||
|
||||
const mock = jest.spyOn(UserSettings, 'getEncryptionKey');
|
||||
mock.mockResolvedValue(undefined);
|
||||
@@ -506,8 +516,8 @@ test('GET /credentials/:id should fail with missing encryption key', async () =>
|
||||
});
|
||||
|
||||
test('GET /credentials/:id should return 404 if cred not found', async () => {
|
||||
const owner = await Db.collections.User!.findOneOrFail();
|
||||
const authMemberAgent = utils.createAgent(app, { auth: true, user: owner });
|
||||
const ownerShell = await testDb.createUserShell(globalOwnerRole);
|
||||
const authMemberAgent = utils.createAgent(app, { auth: true, user: ownerShell });
|
||||
|
||||
const response = await authMemberAgent.get('/credentials/789');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user