RocketChat/Rocket.Chat

View on GitHub
apps/meteor/ee/app/authorization/server/validateUserRoles.spec.ts

Summary

Maintainability
D
3 days
Test Coverage
import { MeteorError } from '@rocket.chat/core-services';
import { License, MockedLicenseBuilder } from '@rocket.chat/license';

import { validateUserRoles } from './validateUserRoles';

beforeEach(async () => {
    const license = new MockedLicenseBuilder();
    await License.setWorkspaceUrl('http://localhost:3000');
    License.setLicenseLimitCounter('activeUsers', () => 0);
    License.setLicenseLimitCounter('guestUsers', () => 0);
    License.setLicenseLimitCounter('roomsPerGuest', async () => 0);
    License.setLicenseLimitCounter('privateApps', () => 0);
    License.setLicenseLimitCounter('marketplaceApps', () => 0);
    License.setLicenseLimitCounter('monthlyActiveContacts', async () => 0);

    License.setLicenseLimitCounter('activeUsers', () => 1);

    license
        .withLimits('activeUsers', [
            {
                max: 1,
                behavior: 'prevent_action',
            },
        ])
        .withLimits('guestUsers', [
            {
                max: 1,
                behavior: 'prevent_action',
            },
        ]);

    await License.setLicense(await license.sign());
});

describe('Operating after activeUsers Limits', () => {
    beforeEach(async () => {
        License.setLicenseLimitCounter('activeUsers', () => 1);
    });

    describe('Adding a new user', () => {
        it('should  throw error when user is active as undefined', async () => {
            const user = {
                roles: ['user'],
            };

            await expect(validateUserRoles(user)).rejects.toThrow(MeteorError);
        });

        it('should not throw error when user is not active', async () => {
            const user = {
                active: false,
                type: 'user',
            };

            await expect(validateUserRoles(user)).resolves.not.toThrow();
        });

        it('should not throw error when user is an app', async () => {
            const user = {
                active: true,
                type: 'app',
            };

            await expect(validateUserRoles(user)).resolves.not.toThrow();
        });

        it('should not throw error when user is a bot', async () => {
            const user = {
                active: true,
                type: 'bot',
            };

            await expect(validateUserRoles(user)).resolves.not.toThrow();
        });

        it('should not throw error when user is a guest', async () => {
            const user = {
                active: true,
                type: 'user',
                roles: ['guest'],
            };

            await expect(validateUserRoles(user)).resolves.not.toThrow();
        });

        it('should throw error when user is active', async () => {
            const user = {
                active: true,
                type: 'user',
            };
            await expect(validateUserRoles(user)).rejects.toThrow(MeteorError);
        });
    });

    describe('Editing an existing user', () => {
        beforeEach(async () => {
            License.setLicenseLimitCounter('guestUsers', () => 1);
        });
        afterEach(async () => {
            License.setLicenseLimitCounter('guestUsers', () => 0);
        });

        it('should throw an error when we try to activate a user', async () => {
            const user = {
                active: true,
                type: 'user',
            };
            const currentUser = {
                active: false,
                type: 'user',
            };
            await expect(validateUserRoles(user, currentUser)).rejects.toThrow(MeteorError);
        });

        it('should not throw an error when we try to deactivate a user', async () => {
            const user = {
                active: false,
                type: 'user',
            };
            const currentUser = {
                active: true,
                type: 'user',
            };
            await expect(validateUserRoles(user, currentUser)).resolves.not.toThrow();
        });

        it('should not throw an error when we try to change an active user', async () => {
            const user = {
                active: true,
                type: 'user',
            };
            const currentUser = {
                active: true,
                type: 'user',
            };
            await expect(validateUserRoles(user, currentUser)).resolves.not.toThrow();
        });

        it('should throw an error when we try to convert a bot to a user', async () => {
            const user = {
                active: true,
                type: 'user',
            };
            const currentUser = {
                active: true,
                type: 'bot',
            };
            await expect(validateUserRoles(user, currentUser)).rejects.toThrow(MeteorError);
        });
    });
});

describe('Operating after guestUsers Limits', () => {
    beforeEach(async () => {
        License.setLicenseLimitCounter('guestUsers', () => 1);
    });

    it('should throw an error when we try to convert an user to guest', async () => {
        const user = {
            active: true,
            type: 'user',
            roles: ['guest'],
        };
        const currentUser = {
            active: true,
            type: 'user',
        };
        await expect(validateUserRoles(user, currentUser)).rejects.toThrow(MeteorError);
    });

    it('should  throw an error when we try to convert app to guest', async () => {
        const user = {
            active: true,
            type: 'user',
            roles: ['guest'],
        };
        const currentUser = {
            active: true,
            type: 'app',
        };
        await expect(validateUserRoles(user, currentUser)).rejects.toThrow(MeteorError);
    });

    it('should not throw an error when we try to edit a guest', async () => {
        const user = {
            active: true,
            type: 'user',
            roles: ['guest'],
        };
        const currentUser = {
            active: true,
            type: 'user',
            roles: ['guest'],
        };
        await expect(validateUserRoles(user, currentUser)).resolves.not.toThrow();
    });
});

describe('Operating under activeUsers Limits', () => {
    beforeEach(async () => {
        License.setLicenseLimitCounter('activeUsers', () => 0);
    });

    describe('Adding a new user', () => {
        it('should not throw an error validating a regular user', async () => {
            const user = {
                active: true,
                type: 'user',
            };
            await expect(validateUserRoles(user)).resolves.not.toThrow();
        });
    });

    describe('Editing an existing user', () => {
        it('should not throw an error when we try to activate a user', async () => {
            const user = {
                active: true,
                type: 'user',
            };
            const currentUser = {
                active: false,
                type: 'user',
            };
            await expect(validateUserRoles(user, currentUser)).resolves.not.toThrow();
        });

        it('should not throw an error when we try to convert a guest to a user', async () => {
            const user = {
                active: true,
                type: 'user',
            };
            const currentUser = {
                active: true,
                type: 'user',
                roles: ['guest'],
            };
            await expect(validateUserRoles(user, currentUser)).resolves.not.toThrow();
        });
        it('should not throw an error when we try to convert a bot to a user', async () => {
            const user = {
                active: true,
                type: 'user',
            };
            const currentUser = {
                active: true,
                type: 'bot',
            };
            await expect(validateUserRoles(user, currentUser)).resolves.not.toThrow();
        });
        it('should not throw an error when we try to convert an app to a user', async () => {
            const user = {
                active: true,
                type: 'user',
            };
            const currentUser = {
                active: true,
                type: 'app',
            };
            await expect(validateUserRoles(user, currentUser)).resolves.not.toThrow();
        });
    });
});