package Test::WWW::Mechanize::Dancer;
use strict;
use warnings;
use Cwd;
use Dancer qw(:tests :moose);
use Module::Load qw(load);
use Moose;
use Test::WWW::Mechanize::PSGI;

our $VERSION = '0.003'; # VERSION

has appdir      => (is => 'ro', default => getcwd );
has envdir      => (is => 'ro');
has agent       => (is => 'ro', default => 'Dancer Tests');
has confdir     => (is => 'ro');
has environment => (is => 'ro', default => 'test');
has public      => (is => 'ro');
has views       => (is => 'ro');
has mech_class  => (is => 'ro', default => 'Test::WWW::Mechanize::PSGI');

has mech        => (
    is      => 'ro',
    lazy    => 1,
    default => sub {
        my ($self) = @_;

        load $self->mech_class;
        my $m = $self->mech_class->new(
            app => sub {
                my $env = shift;
                set (
                    appdir => $self->appdir,
                    envdir => $self->envdir || path($self->appdir, 'environments'),
                    confdir => $self->confdir || $self->appdir,
                    public => $self->public || path($self->appdir,  '/public'),
                    views => $self->views || path($self->appdir, '/views' ),
                    environment => $self->environment,
                );
                my $request = Dancer::Request->new( env => $env );
                Dancer->dance( $request );
            }
        );
        $m->agent($self->agent);
        return $m;
    },
);

# ABSTRACT: Wrapper to easily use Test::WWW::Mechanize with your Dancer apps


1;


__END__
=pod

=head1 NAME

Test::WWW::Mechanize::Dancer - Wrapper to easily use Test::WWW::Mechanize with your Dancer apps

=head1 VERSION

version 0.003

=head1 SYNOPSIS

    use MyDancerApp;
    use Test::WWW::Mechanize::Dancer;

    # Get your standard Test::WWW::Mechanize object
    my $mech = Test::WWW::Mechanize::Dancer->new(
        # settings here if required
    )->mech;
    # Run standard Test::WWW::Mechanize tests
    $mech->get_ok('/');

=head1 DESCRIPTION

This is a simple wrapper that lets you test your Dancer apps using
Test::WWW::Mechanize.

=head1 SETTINGS

=head2 appdir

Probably the main thing you will want to set, C<appdir> sets the base
directory for the app.  C<confdir>, C<views>, and C<public>, will be 
set to C<appdir>, C<appdir>/views, and C<appdir>/public
respectively if not set explicitly.

The C<appdir> defaults to the current working directory, which works
in most testing cases.

=head2 agent

Allows you to set the user agent of the Mechanizer.

=head2 confdir

Set the dancer confdir.  Will default to appdir if unspecified.

=head2 envdir

Allows you to set the directory where Dancer should look for the config files
for each environment.  Defaults to 'environments' under appdir.  Note if your
app uses $ENV{DANCER_ENVDIR} you should explicitly pass that value using this
option.

=head2 environment

Allows you to set the Dancer environment to run your app in.  Defaults to
'test'

=head2 mech_class

Allows you to override the class used to instantiate the user agent object.
Use this to invoke your own class with project-specific test-helper methods.
Defaults to 'Test::WWW::Mechanize::PSGI' - which your class should inherit
from.  Note, it is your responsibility to 'require' the class.

=head2 public

Set the public directory for your dancer app.  Defaults to C<appdir>/public

=head2 views

Set the views directory for your dancer app.  Defaults to C<appdir>/views

=head1 AUTHORS

=over 4

=item *

William Wolf <throughnothing@gmail.com>

=item *

Grant McLean <grantm@cpan.org>

=back

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2011 by William Wolf.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut

