"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const sinon = require("sinon");
const fs_macchiato_1 = require("../../../fs.macchiato");
const settings_1 = require("../settings");
const provider = require("./async");
describe('Providers → Async', () => {
    describe('.read', () => {
        it('should return lstat for non-symlink entry', (done) => {
            const lstat = sinon.stub().yields(null, new fs_macchiato_1.Stats());
            const settings = new settings_1.default({
                fs: { lstat }
            });
            provider.read('filepath', settings, (error, stats) => {
                assert.strictEqual(error, null);
                assert.strictEqual(stats.ino, 0);
                done();
            });
        });
        it('should return lstat for symlink entry when the "followSymbolicLink" option is disabled', (done) => {
            const lstat = sinon.stub().yields(null, new fs_macchiato_1.Stats({ isSymbolicLink: true }));
            const settings = new settings_1.default({
                followSymbolicLink: false,
                fs: { lstat }
            });
            provider.read('filepath', settings, (error, stats) => {
                assert.strictEqual(error, null);
                assert.strictEqual(stats.ino, 0);
                done();
            });
        });
        it('should return stat for symlink entry', (done) => {
            const lstat = sinon.stub().yields(null, new fs_macchiato_1.Stats({ isSymbolicLink: true }));
            const stat = sinon.stub().yields(null, new fs_macchiato_1.Stats({ ino: 1 }));
            const settings = new settings_1.default({
                fs: { lstat, stat }
            });
            provider.read('filepath', settings, (error, stats) => {
                assert.strictEqual(error, null);
                assert.strictEqual(stats.ino, 1);
                done();
            });
        });
        it('should return marked stat for symlink entry when the "markSymbolicLink" option is enabled', (done) => {
            const lstat = sinon.stub().yields(null, new fs_macchiato_1.Stats({ isSymbolicLink: true }));
            const stat = sinon.stub().yields(null, new fs_macchiato_1.Stats({ ino: 1 }));
            const settings = new settings_1.default({
                fs: { lstat, stat },
                markSymbolicLink: true
            });
            provider.read('filepath', settings, (error, stats) => {
                assert.strictEqual(error, null);
                assert.strictEqual(stats.isSymbolicLink(), true);
                done();
            });
        });
        it('should return lstat for broken symlink entry when the "throwErrorOnBrokenSymbolicLink" option is disabled', (done) => {
            const lstat = sinon.stub().yields(null, new fs_macchiato_1.Stats({ isSymbolicLink: true }));
            const stat = sinon.stub().yields(new Error());
            const settings = new settings_1.default({
                fs: { lstat, stat },
                throwErrorOnBrokenSymbolicLink: false
            });
            provider.read('filepath', settings, (error, stats) => {
                assert.strictEqual(error, null);
                assert.strictEqual(stats.ino, 0);
                done();
            });
        });
        it('should throw an error when symlink entry is broken', (done) => {
            const lstat = sinon.stub().yields(null, new fs_macchiato_1.Stats({ isSymbolicLink: true }));
            const stat = sinon.stub().yields(new Error('broken'));
            const settings = new settings_1.default({
                fs: { lstat, stat }
            });
            provider.read('filepath', settings, (error) => {
                assert.strictEqual(error.message, 'broken');
                done();
            });
        });
    });
});