use warnings;
use Test::More;
use strict;
use IO::String;
use MIME::Base64;
use JSON;

require 't/test-lib.pm';

my $res;
my $client = LLNG::Manager::Test->new(
    {
        ini => {
            logLevel           => 'error',
            useSafeJail        => 1,
            requireToken       => 1,
            restAuthServer     => 1,
            restPasswordServer => 1,
            authentication     => 'Combination',
            userDB             => 'Same',

            combination => '[K,Dm] or [Dm]',
            combModules => {
                K => {
                    for  => 1,
                    type => 'Kerberos',
                },
                Dm => {
                    for  => 0,
                    type => 'Demo',
                },
            },
            krbKeytab => '/etc/keytab',
            krbByJs   => 1,
        }
    }
);

# Test pwdConfirm endpoint
$res = expectJSON(
    postJSON(
        $client,
        "/proxy/pwdConfirm",
        {
            user     => "dwho",
            password => "dwho",
        }
    )
);

is( $res->{result}, 1, "Correct password is accepted" );
count(1);

$res = expectJSON(
    postJSON(
        $client,
        "/proxy/pwdConfirm",
        {
            user     => "waldo",
            password => "dwho",
        }
    )
);

is( $res->{result}, 0, "Incorrect user is rejected" );
count(1);

$res = expectJSON(
    postJSON(
        $client,
        "/proxy/pwdConfirm",
        {
            user     => "dwho",
            password => "wrongpass",
        }
    )
);

is( $res->{result}, 0, "Incorrect password is rejected" );
count(1);

# Test getUser endpoint
# Existing user
$res = expectJSON(
    postJSON(
        $client,
        "/proxy/getUser",
        {
            user => "dwho",
        }
    )
);
is( $res->{result},               1,            "Correct result" );
is( $res->{info}->{cn},           "Doctor Who", "Correct attributes" );
is( $res->{info}->{_whatToTrace}, "dwho",       "Correct macro" );
count(3);

# Missing user
$res = expectJSON(
    postJSON(
        $client,
        "/proxy/getUser",
        {
            user => "notfound",
        }
    )
);
is( $res->{result}, 0,     "Correct result" );
is( $res->{info},   undef, "No attributes" );
count(2);

clean_sessions();
done_testing( count() );

sub postJSON {
    my ( $portal, $url, $payload ) = @_;
    my $string_payload = to_json($payload);
    return $portal->_post(
        $url,
        IO::String->new($string_payload),
        accept => 'application/json',
        type   => 'application/json',
        length => length($string_payload)
    );
}
