The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use strict;
use warnings;

use Test::More 'no_plan';

{
    package WebApp::Foo::Bar::Baz;
    use Test::More;

    use base 'CGI::Application';
    use CGI::Application::Plugin::Config::Context;
    sub conf_driver {
        my $self = shift;
        return $self->param('conf_driver');
    }

    sub setup {
        my $self = shift;

        $self->header_type('none');
        $self->run_modes(
            'start' => 'default',
        );
        $self->mode_param(
            '-path_info' => 2,
        );

        $ENV{'SCRIPT_NAME'} = '/foo/bar';
        $ENV{'PATH_INFO'}   = '/baz';

        $ENV{'SITE_NAME'}   = 'fred';

        my $conf_driver = $self->conf_driver;
        $self->conf('one')->init(
            file   => "t/conf-$conf_driver/06-multiple-matches.conf",
            cache_config_files => 0,
            driver => $conf_driver,
            driver_options => {
                ConfigScoped => {
                    warnings => {
                        permissions => 'off',
                    }
                }
            }
        );

    }

    sub default {
        my $self = shift;

        is($self->conf('one')->param('winner'),          '/foo',        $self->conf_driver . ': winner');
        is($self->conf('one')->param('location_winner'), '/foo',        $self->conf_driver . ': location_winner');
        is($self->conf('one')->param('app_winner'),      'WebApp::Foo', $self->conf_driver . ': app_winner');
        is($self->conf('one')->param('site_winner'),     'fred',        $self->conf_driver . ': site_winner');
        ok(!$self->conf('one')->param('gordon_winner'),                 $self->conf_driver . ': gordon_winner');
        ok(!$self->conf('one')->param('none'),                          $self->conf_driver . ': none');
        ok(!$self->conf('one')->param('tony'),                          $self->conf_driver . ': tony');
        is($self->conf('one')->param('fred'),            1,             $self->conf_driver . ': fred');
        is($self->conf('one')->param('foo'),             1,             $self->conf_driver . ': foo');
        is($self->conf('one')->param('slash_foo'),       1,             $self->conf_driver . ': /foo');
        is($self->conf('one')->param('WebApp_Foo'),      1,             $self->conf_driver . ': WebApp::Foo');
        ok(!$self->conf('one')->param('WebApp_Bar'),                    $self->conf_driver . ': WebApp::Bar');
        is($self->conf('one')->param('Bar'),             1,             $self->conf_driver . ': Bar');

        ok(eq_array([sort $self->conf('one')->param()], [ sort qw{
                                                                  Bar
                                                                  slash_foo
                                                                  winner
                                                                  WebApp_Foo
                                                                  site_winner
                                                                  location_winner
                                                                  foo
                                                                  app_winner
                                                                  fred
                                                                } ]),     $self->conf_driver . ': keys');

        return "";
    }
}


SKIP: {
    if (test_driver_prereqs('ConfigGeneral')) {
        WebApp::Foo::Bar::Baz->new(PARAMS => { conf_driver => 'ConfigGeneral' })->run;
    }
    else {
        skip "Config::General not installed", 14;
    }
}
SKIP: {
    if (test_driver_prereqs('ConfigScoped')) {
        WebApp::Foo::Bar::Baz->new(PARAMS => { conf_driver => 'ConfigScoped'  })->run;
    }
    else {
        skip "Config::Scoped not installed", 14;
    }
}
SKIP: {
    if (test_driver_prereqs('XMLSimple')) {
        WebApp::Foo::Bar::Baz->new(PARAMS => { conf_driver => 'XMLSimple'     })->run;
    }
    else {
        skip "XML::Simple, XML::SAX or XML::Filter::XInclude not installed", 14;
    }
}

sub test_driver_prereqs {
    my $driver = shift;
    my $driver_module = 'Config::Context::' . $driver;
    eval "require $driver_module;";
    die $@ if $@;

    eval "require $driver_module;";
    my @required_modules = $driver_module->config_modules;

    foreach (@required_modules) {
        eval "require $_;";
        if ($@) {
            return;
        }
    }
    return 1;

}