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

use Test::More tests => 14;
use strict;

our @ISA = qw(Lemonldap::NG::Portal::IssuerDBOpenID
  Lemonldap::NG::Portal::OpenID::SREG Lemonldap::NG::Portal::Simple);

sub lmLog {
    my ( $self, $msg, $level ) = splice @_;

    #print STDERR "[$level] $msg\n";
}

our $param = { confirm => 0 };

sub param {
    my ( $self, $key ) = splice @_;
    return $param->{$key};
}

sub info                    { }
sub _sub                    { }
sub updatePersistentSession { }

$ENV{HTTP_ACCEPT_LANGUAGE} = 'en';
SKIP: {
    eval { require Net::OpenID::Server; };
    skip(
        "Net::OpenID::Consumer is not installed, so "
          . "Lemonldap::NG::Portal::AuthOpenID will not be useable",
        14
    ) if ($@);
    use_ok('Lemonldap::NG::Portal::OpenID::Server');
    use_ok('Lemonldap::NG::Portal::IssuerDBOpenID');
    use_ok('Lemonldap::NG::Portal::OpenID::SREG');

    my $p = bless {
        sessionInfo => {
            uid  => 'test',
            mail => 'x.x.org'
        },
        whatToTrace => 'uid',
      },
      __PACKAGE__;

    my ( $r, $h );
    ( $r, $h ) = $p->sregHook( '', '', 0, 0, {} );
    ok( $r == 0, 'SREG: Call sregHook with untrusted request' );
    $param->{confirm} = -1;
    ok(
        !$p->sregHook( '', '', 1, 1, {} ),
        'SREG: call sregHook with confirm => -1'
    );
    $param->{confirm} = 1;
    ok(
        $p->sregHook( '', '', 1, 1, {} ),
        'SREG: call sregHook without arguments'
    );
    ( $r, $h ) =
      $p->sregHook( '', '', 1, 1,
        { required => 'fullname,email', optional => 'nickname' },
      );
    ok( $r == 0, 'SREG: 0 returned unless required attributes are configured' );
    $p->{openIdSreg_fullname} = '$uid';
    $p->{openIdSreg_email}    = '$mail';
    $p->{openIdSreg_nickname} = '$uid';
    ( $r, $h ) =
      $p->sregHook( '', '', 1, 1,
        { required => 'fullname,email', optional => 'nickname' },
      );
    ok( $r == 1, 'SREG: 1 returned if required attributes are configured' );
    ok( ref($h), 'SREG: Parameters returned as hashref' );
    ok( ( $h->{email} eq 'x.x.org' and $h->{fullname} eq 'test' ),
        'SREG: required attributes returned' );
    ok( !defined( $h->{nickname} ), 'SREG: optional parameter not returned' );
    $param->{sreg_nickname} = 0;
    ( $r, $h ) =
      $p->sregHook( '', '', 1, 1,
        { required => 'fullname,email', optional => 'nickname' },
      );
    ok( !defined( $h->{nickname} ),
        'SREG: optional unwanted parameter not returned' );
    $param->{sreg_nickname} = 'OK';
    ( $r, $h ) =
      $p->sregHook( '', '', 1, 1,
        { required => 'fullname,email', optional => 'nickname' },
      );
    ok( defined( $h->{nickname} ), 'SREG: optional wanted parameter returned' );

    $param->{confirm} = 0;
    ( $r, $h ) =
      $p->sregHook( '', '', 1, 1,
        { required => 'fullname,email', optional => 'nickname' },
      );
    ok( ( $r == 0 and ref($h) ),
        'SREG: 0 returned for unconfirmed parameters' );
}