diff --git a/debian/control b/debian/control index b4a4fb90d..6d9446ae6 100644 --- a/debian/control +++ b/debian/control @@ -42,6 +42,7 @@ Build-Depends-Indep: libapache-session-perl , libstring-random-perl , libtest-mockobject-perl , libtest-pod-perl , + libtest-output-perl , libtext-unidecode-perl , libtime-fake-perl , libunicode-string-perl , diff --git a/lemonldap-ng-manager/t/16-cli.t b/lemonldap-ng-manager/t/16-cli.t index f9a98d676..c1a4a8223 100644 --- a/lemonldap-ng-manager/t/16-cli.t +++ b/lemonldap-ng-manager/t/16-cli.t @@ -1,105 +1,114 @@ use Test::More; +use Test::Output; use JSON; use strict; require 't/test-lib.pm'; -my $tests = 14; +my $tests = 17; use_ok('Lemonldap::NG::Common::Cli'); use_ok('Lemonldap::NG::Manager::Cli'); &cleanConfFiles; -SKIP: { - eval 'use Test::Output;'; - if ($@) { - skip 'Test::Output is missing, skipping', $tests - 2; - } - my $client = - Lemonldap::NG::Manager::Cli->new( iniFile => 't/lemonldap-ng.ini' ); - my $commonClient = - Lemonldap::NG::Common::Cli->new( iniFile => 't/lemonldap-ng.ini' ); - my @cmd; - my $res; - - # Test 'set' command - @cmd = qw(-yes 1 set notification 1); - Capture::Tiny::capture_stdout( sub { $client->run(@cmd) } ); - - # Test 'get' command - @cmd = qw(get notification); - $res = Capture::Tiny::capture_stdout( sub { $client->run(@cmd) } ); - ok( $res =~ /^notification\s+=\s+1$/, '"get notification" OK' ) - or diag " $res"; - - # Test 'addKey' command - @cmd = qw(-yes 1 addKey locationRules/test1.example.com ^/reject deny); - Test::Output::combined_like( - sub { $client->run(@cmd) }, - qr#'\^/reject' => 'deny'#s, - '"addKey" OK' - ); - - # Test 'delKey' command - @cmd = qw(-yes 1 delKey locationRules/test1.example.com ^/reject); - Test::Output::combined_unlike( - sub { $client->run(@cmd) }, - qr#'\^/reject' => 'deny'#s, - '"delKey" OK' - ); - - # Test 'get' command with key/subkey - @cmd = qw(get locationRules/test1.example.com); - $res = Capture::Tiny::capture_stdout( sub { $client->run(@cmd) } ); - ok( $res =~ m#(?:/logout|default)#, '"get key/subkey" OK' ) - or diag "$res"; - - # Test 'set' command with key/subkey - @cmd = qw(-yes 1 set locationRules/test1.example.com/default deny); - Capture::Tiny::capture_stdout( sub { $client->run(@cmd) } ); - - # Test 'save' command - @cmd = ('save'); - $res = Capture::Tiny::capture_stdout( sub { $client->run(@cmd) } ); - ok( $res =~ /^\s*(\{.*\})\s*$/s, '"save" result looks like JSON' ); - eval { JSON::from_json($res) }; - ok( not($@), ' result is JSON' ) or diag "error: $@"; - - # Test 'restore' command - close STDIN; - open STDIN, '<', \$res; - @cmd = ( 'restore', '-' ); - Test::Output::combined_like( sub { $client->run(@cmd) }, - qr/"cfgNum"\s*:\s*"3"/s, 'New config: 3' ); - - # Test 'set' command with force - @cmd = qw(-yes 1 -force 1 -cfgNum 2 set useSafeJail 0); - Test::Output::combined_like( - sub { $client->run(@cmd) }, - qr#cfgNum forced with 2#s, - '"Force cfgNum" OK' - ); - - # Test 'update-cache' command with force - @cmd = qw(update-cache); - Test::Output::combined_like( - sub { $commonClient->run(@cmd) }, - qr#Cache updated to configuration 3#s, - '"update-cache" OK' - ); - - # Test 'info' command with force - @cmd = qw(info); - Test::Output::combined_like( - $res = sub { $commonClient->run(@cmd) }, - qr#\bAuthor IP\b#s, - '"Author IP" OK' - ); - Test::Output::combined_like( $res = sub { $commonClient->run(@cmd) }, - qr#\bLog\b#s, '"Log" OK' ); - Test::Output::combined_like( $res = sub { $commonClient->run(@cmd) }, - qr#\bVersion\b#s, '"Version" OK' ); +sub llclient { + return Lemonldap::NG::Manager::Cli->new( iniFile => 't/lemonldap-ng.ini' ); } +sub llcommonClient { + return Lemonldap::NG::Common::Cli->new( iniFile => 't/lemonldap-ng.ini' ); +} + +my @cmd; +my $res; + +# Test 'set' command +@cmd = qw(-yes 1 set notification 1); +combined_like( + sub { llclient->run(@cmd) }, + qr/Saved under/, + '"addKey" OK' +); + +# Test 'get' command +@cmd = qw(get notification); +$res = Test::Output::stdout_from( sub { llclient->run(@cmd) } ); +ok( $res =~ /^notification\s+=\s+1$/, '"get notification" OK' ) + or diag " $res"; + +# Test 'addKey' command +@cmd = qw(-yes 1 addKey locationRules/test1.example.com ^/reject deny); +combined_like( + sub { llclient->run(@cmd) }, + qr/Saved under/, + '"addKey" OK' +); + +# Test 'delKey' command +@cmd = qw(-yes 1 delKey locationRules/test1.example.com ^/reject); +combined_unlike( + sub { llclient->run(@cmd) }, + qr#'\^/reject' => 'deny'#s, + '"delKey" OK' +); + +# Test 'get' command with key/subkey +@cmd = qw(get locationRules/test1.example.com/default); +$res = Test::Output::stdout_from( sub { llclient->run(@cmd) } ); +ok( $res =~ m#accept#, '"get key/subkey" OK' ) + or diag "$res"; + +# Test 'set' command with key/subkey +@cmd = qw(-yes 1 set locationRules/test1.example.com/default deny); +combined_like( + sub { llclient->run(@cmd) }, + qr/Saved under/, + '"addKey" OK' +); + +# Test 'save' command +@cmd = qw(-cfgNum 1 save); +$res = Test::Output::stdout_from( sub { llclient->run(@cmd) } ); +ok( $res =~ /^\s*(\{.*\})\s*$/s, '"save" result looks like JSON' ); +my $j; +eval { $j = JSON::from_json($res) }; +is( $j->{cfgNum}, 1, "correct version number" ); +ok( not($@), ' result is JSON' ) or diag "error: $@"; + +# Test 'restore' command +my $tmpFile = File::Temp->new(); +print $tmpFile $res; +@cmd = ( 'restore', $tmpFile->filename ); +combined_like( sub { llclient->run(@cmd) }, + qr/"cfgNum"\s*:\s*\d*/s, 'New config' ); + +# Test 'set' command with force +@cmd = qw(-yes 1 -force 1 -cfgNum 2 set useSafeJail 0); +combined_like( + sub { llclient->run(@cmd) }, + qr#cfgNum forced with 2#s, + '"Force cfgNum" OK' +); + +# Test 'info' command with force +@cmd = qw(info); +combined_like( + sub { llcommonClient->run(@cmd) }, + qr#\bAuthor IP\b#s, + '"Author IP" OK' +); +combined_like( sub { llcommonClient->run(@cmd) }, + qr#\bLog\b#s, '"Log" OK' ); +combined_like( sub { llcommonClient->run(@cmd) }, + qr#\bVersion\b#s, '"Version" OK' ); + +# Test 'rollback' command +@cmd = qw(rollback); +combined_like( + sub { llclient->run(@cmd) }, + qr/Configuration \d+ has been rolled back/, + '"Author IP" OK' +); + count($tests); done_testing( count() ); &cleanConfFiles; diff --git a/rpm/lemonldap-ng.spec b/rpm/lemonldap-ng.spec index 6a672854e..792870629 100644 --- a/rpm/lemonldap-ng.spec +++ b/rpm/lemonldap-ng.spec @@ -153,6 +153,7 @@ BuildRequires: perl(strict) BuildRequires: perl(String::Random) BuildRequires: perl(Sys::Syslog) BuildRequires: perl(Test::MockObject) +BuildRequires: perl(Test::Output) BuildRequires: perl(Test::Pod) >= 1.00 BuildRequires: perl(Text::Unidecode) BuildRequires: perl(Time::Fake)