use warnings;
use Test::More;
use strict;
use IO::String;
use JSON;
use Lemonldap::NG::Portal::Main::Constants
  qw(PE_BADOLDPASSWORD PE_PASSWORD_MISMATCH PE_PP_MUST_SUPPLY_OLD_PASSWORD);

require 't/test-lib.pm';

my $res;

my $client = LLNG::Manager::Test->new( {
        ini => {
            logLevel                 => 'error',
            passwordDB               => 'Demo',
            portalRequireOldPassword => 1,
            customPlugins            => 't::PasswordHookPlugin',
        }
    }
);

ok( $res = $client->_get( '/', accept => 'text/html' ), 'Get Menu' );
count(1);

# Try to authenticate
# -------------------
ok(
    $res = $client->_post(
        '/',
        IO::String->new('user=dwho&password=dwho'),
        length => 23
    ),
    'Auth query'
);
count(1);
expectOK($res);
my $id = expectCookie($res);

# Test bad new password
my $s = buildForm( {
        oldpassword     => "dwho",
        newpassword     => "12345",
        confirmpassword => "12345",
    }
);
ok(
    $res = $client->_post(
        '/',
        IO::String->new($s),
        cookie => "lemonldap=$id",
        accept => 'application/json',
        length => length($s),
    ),
    'Bad new password'
);
count(1);
expectReject( $res, 400, 28 );

# Test good new password
$s = buildForm( {
        oldpassword     => "dwho",
        newpassword     => "12346",
        confirmpassword => "12346",
    }
);
ok(
    $res = $client->_post(
        '/',
        IO::String->new($s),
        cookie => "lemonldap=$id",
        accept => 'application/json',
        length => length($s),
    ),
    'Correct new password'
);
count(1);

expectReject( $res, 200, 35, "Expect PE_PASSWORD_OK" );
my $pdata = expectPdata($res);
is( $pdata->{afterHook}, "dwho-dwho-12346",
    "passwordAfterChange hook worked as expected" );
count(1);

# Test $client->logout
$client->logout($id);

#print STDERR Dumper($res);

clean_sessions();

done_testing( count() );
