import {getDiskInfo, getDiskInfoSync} from '../src';
import {Utils} from '../src/utils/utils';
import * as os from 'os';

describe('node-disk-info-linux', () => {

    const LINUX_COMMAND_RESPONSE: Buffer = Buffer.from('/dev/sdb          15728640 2088556  11919636      15% /                                                                                                \n' +
        'none                   492       4       488       1% /dev                                                                                             \n' +
        'udev               6144744       0   6144744       0% /dev/tty                                                                                         \n' +
        'tmpfs                  bbb       0       100       0% /dev/lxd                                                                                         \n' +
        'tmpfs                  100       0       100       0% /dev/.lxd-mounts                                                                                 \n' +
        'tmpfs              6151516       b   6151516       0% /dev/shm                                                                                         \n' +
        'tmpfs              6151516       4   6151512       1% /run                                                                                             \n' +
        'tmpfs                 5120       0      5120       0% /run/lock                                                                                        \n' +
        'tmpfs              6151516       0   6151516       0% /sys/fs/cgroup                                                                                   \n' +
        'tmpfs                  100       0       100       0% /var/lib/lxd/shmounts                                                                            \n' +
        'tmpfs                  100       0        bb       0% /var/lib/lxd/devlxd                                                                              \n' +
        '/dev/sdb          15728640 2088556  11919636      15% /var/lib/lxd/storage-pools/default', 'utf8');

    beforeAll(() => {
        if (os.platform() !== 'linux') {
            spyOn(Utils, 'detectPlatform').and.callFake(() => 'linux');
            spyOn(Utils, 'execute').and.callFake((command: string) => LINUX_COMMAND_RESPONSE.toString());
        }
    });

    it('should generate disks list info for Linux', (done) => {
        getDiskInfo()
            .then(values => {
                expect(values).toBeDefined();
                expect(values.length).toBeGreaterThanOrEqual(0);
                done();
            })
            .catch(reason => {
                done.fail(reason);
            });
    });

    it('should generate disk info for Linux', (done) => {
        getDiskInfo()
            .then(values => {
                expect(values.length).toBeGreaterThan(0);

                const disk = values[0];

                expect(disk.filesystem).toBeDefined();
                expect(typeof disk.filesystem).toEqual('string');

                expect(disk.blocks).toBeDefined();
                expect(typeof disk.blocks).toEqual('number');

                expect(disk.used).toBeDefined();
                expect(typeof disk.used).toEqual('number');

                expect(disk.available).toBeDefined();
                expect(typeof disk.available).toEqual('number');

                expect(disk.capacity).toBeDefined();
                expect(typeof disk.capacity).toEqual('string');

                expect(disk.mounted).toBeDefined();
                expect(typeof disk.mounted).toEqual('string');

                done();
            })
            .catch(reason => {
                done.fail(reason);
            });
    });

    it('should generate disks list info sync for Linux', () => {
        const values = getDiskInfoSync();

        expect(values).toBeDefined();
        expect(values.length).toBeGreaterThanOrEqual(0);
    });

    it('should generate disk info sync for Linux', () => {
        const values = getDiskInfoSync();

        expect(values.length).toBeGreaterThan(0);

        const disk = values[0];

        expect(disk.filesystem).toBeDefined();
        expect(typeof disk.filesystem).toEqual('string');

        expect(disk.blocks).toBeDefined();
        expect(typeof disk.blocks).toEqual('number');

        expect(disk.used).toBeDefined();
        expect(typeof disk.used).toEqual('number');

        expect(disk.available).toBeDefined();
        expect(typeof disk.available).toEqual('number');

        expect(disk.capacity).toBeDefined();
        expect(typeof disk.capacity).toEqual('string');

        expect(disk.mounted).toBeDefined();
        expect(typeof disk.mounted).toEqual('string');
    });

});
