package Catalyst::Authentication::Credential::Testing;
use base 'Catalyst::Authentication::Credential::Password';

use strict;
use warnings;

use Carp;
use Catalyst::Exception;

our $VERSION = '0.01';

=head1 NAME

Catalyst::Authentication::Credential::Testing

=head1 SYNOPSIS

    # Setup the auth in your config on your dev machines only
    __PACKAGE__->config(

        'Plugin::Authentication' => {
            default_realm => 'your_realm',
            realms        => {
                your_realm => {
                    credential => {
                        class           => 'Testing',
                        password_field  => 'password',
                        global_password => 'secret',  # password for all users
                    },
                },
            },
        },

    );

=head1 DESCRIPTION

When your developing an app it is often convenient to be able to log in as any
user. You can either achieve this by disabling authentication (but then you
can't test failed logins) or by setting all the passwords to be the same
(which is annoying).

Or you can use this module and set one password for all users at the
authentication level. This leaves the rest of your code untouched.

=head1 HOW IT WORKS

This module is based on L<Catalyst::Authentication::Credential::Password> and
overides the C<new> and C<check_password> methods.

=head2 new

Checks that the config is complete.

=head2 check_password

Returns true if the password is the same as that set in the config, false
otherwise.

=cut

sub new {
    my ( $class, $config, $app, $realm ) = @_;

    my $self = { _config => $config };
    bless $self, $class;

    $self->realm($realm);

    foreach my $key (qw( global_password password_field )) {

        # we just want to check that this config exists
        next if $self->_config->{$key};

        # produce a message that should be helpful enough to the user that
        # they can debug using it.
        my $msg
            = "ERROR in %s: you must specify '%s' in your credential config";
        Catalyst::Exception->throw( sprintf( $msg, __PACKAGE__, $key ) );

    }

    return $self;
}

sub check_password {
    my ( $self, $user, $authinfo ) = @_;

    # get the values out
    my $password        = $authinfo->{ $self->_config->{password_field} };
    my $global_password = $self->_config->{global_password};

    # success if the two passwords are the same
    return $password eq $global_password;
}

=head1 SEE ALSO

L<Catalyst::Authentication::Credential::Password>

=head1 BUGS

Test suite is minimal.

=head1 AUTHOR

Edmund von der Burg C<<evdb@ecclestoad.co.uk>>

Bug reports and suggestions very welcome.

=head1 ACKNOWLEDGMENTS

Developed whilst working at Foxtons - L<http://www.foxtons.co.uk>. Thank you
for letting me open source this code.

=head1 COPYRIGHT

Copyright (C) 2008 Edmund von der Burg. All rights reserved.

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

THERE IS NO WARRANTY.

=cut

1;