<?php

use Lightscale\LaralightAssets\Assets;
use Lightscale\LaralightAssets\Manifest;

describe('instance', function() {
    it('instantiates', function() {
        new Assets();
    })->throwsNoExceptions();

    it('instantiates from container', function() {
        app(Assets::class);
    })->throwsNoExceptions();

    it('is singleton', function() {
        expect(app(Assets::class))->toBe(app(Assets::class));
    });
});

describe('manages manifests', function() {
    it('adds manifests', function() {
        app(Assets::class)->addManifest(
            'main',
            new Manifest(
                public_path('dist/manifest.json'),
                '/dist',
            ),
            isDefault: true,
        );
    })->throwsNoExceptions();

    it('registers manifests', function() {
        app(Assets::class)->registerManifest(
            'main', public_path('dist/manifest.json'), '/dist', isDefault: true,
        );
    })->throwsNoExceptions();

    it('gets manifests', function() {
        $assets = app(Assets::class);
        $assets->registerManifest(
            'main', public_path('dist/manifest.json'), '/dist', isDefault: true,
        );

        expect($assets->getManifests())
            ->toHaveLength(1)
            ->toContainOnlyInstancesOf(Manifest::class);
    });

    it('gets manifest', function() {
        $assets = app(Assets::class);
        $manifest = new Manifest(
            public_path('dist/manifest.json'),
            '/dist',
        );
        $name = 'main';
        $assets->addManifest($name, $manifest, true);

        expect($assets->getManifest($name))->toBe($manifest);
    });

    it('gets default manifest', function() {
        $assets = app(Assets::class);
        $manifest = new Manifest(
            public_path('dist/manifest.json'),
            '/dist',
        );
        $name = 'main';
        $assets->addManifest($name, $manifest, true);

        expect($assets->getDefaultManifest())->toBe($manifest);
    });

    it('throws exception missing manifest', function() {
        $assets = app(Assets::class);
        $assets->getManifest('main');
    })->throws(Exception::class);

    it('throws exception without default', function() {
        $assets = app(Assets::class);
        $assets->getDefaultManifest();
    })->throws(Error::class);
});