import selectors from '../../helpers/selectors.js';
import getBrowser from '../../helpers/puppeteer';

describe('Account privileges path', () => {
    let browser;
    let page;

    beforeAll(async() => {
        browser = await getBrowser();
        page = browser.page;
        await page.loginAndModule('developer', 'account');
        await page.accessToSearchResult('1101');
        await page.accessToSection('account.card.privileges');
    });

    afterAll(async() => {
        await browser.close();
    });

    describe('as developer', () => {
        it('should throw error when give privileges', async() => {
            await page.waitToClick(selectors.accountPrivileges.checkHasGrant);
            await page.waitToClick(selectors.accountPrivileges.save);

            const message = await page.waitForSnackbar();

            expect(message.text).toContain(`You don't have grant privilege`);
        });

        it('should throw error when change role', async() => {
            await page.autocompleteSearch(selectors.accountPrivileges.role, 'employee');
            await page.waitToClick(selectors.accountPrivileges.save);

            const message = await page.waitForSnackbar();

            expect(message.text).toContain(`You don't have grant privilege`);
        });
    });

    describe('as sysadmin', () => {
        beforeAll(async() => {
            await page.loginAndModule('sysadmin', 'account');
            await page.accessToSearchResult('9');
            await page.accessToSection('account.card.privileges');
        });

        it('should give privileges', async() => {
            await page.waitToClick(selectors.accountPrivileges.checkHasGrant);
            await page.waitToClick(selectors.accountPrivileges.save);
            const message = await page.waitForSnackbar();

            await page.reloadSection('account.card.privileges');
            const result = await page.checkboxState(selectors.accountPrivileges.checkHasGrant);

            expect(message.text).toContain(`Data saved!`);
            expect(result).toBe('checked');
        });

        it('should throw error when change role and not own role', async() => {
            await page.autocompleteSearch(selectors.accountPrivileges.role, 'itBoss');
            await page.waitToClick(selectors.accountPrivileges.save);

            const message = await page.waitForSnackbar();

            expect(message.text).toContain(`You don't own the role and you can't assign it to another user`);
        });

        it('should change role to employee', async() => {
            await page.autocompleteSearch(selectors.accountPrivileges.role, 'employee');
            await page.waitToClick(selectors.accountPrivileges.save);
            const message = await page.waitForSnackbar();

            await page.reloadSection('account.card.privileges');
            const result = await page.waitToGetProperty(selectors.accountPrivileges.role, 'value');

            expect(message.text).toContain(`Data saved!`);
            expect(result).toContain('employee');
        });

        it('should return role to developer', async() => {
            await page.autocompleteSearch(selectors.accountPrivileges.role, 'developer');
            await page.waitToClick(selectors.accountPrivileges.save);
            const message = await page.waitForSnackbar();

            await page.reloadSection('account.card.privileges');
            const result = await page.waitToGetProperty(selectors.accountPrivileges.role, 'value');

            expect(message.text).toContain(`Data saved!`);
            expect(result).toContain('developer');
        });
    });

    describe('as developer again', () => {
        it('should remove privileges', async() => {
            await page.accessToSearchResult('9');
            await page.accessToSection('account.card.privileges');

            await page.waitToClick(selectors.accountPrivileges.checkHasGrant);
            await page.waitToClick(selectors.accountPrivileges.save);
            const message = await page.waitForSnackbar();

            expect(message.text).toContain(`Data saved!`);
        });

        it('should logIn in developer', async() => {
            await page.reloadSection('account.card.privileges');
            const result = await page.checkboxState(selectors.accountPrivileges.checkHasGrant);

            expect(result).toBe('unchecked');
        });
    });
});