X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2Fdot_ssh.t;h=1c752a7985c60382775f3e6e9a68d7e354d4a578;hb=deec7cc438aebbe1d3488f24f0c368821e0993ba;hp=6e0a1c60d6c66208e442be2c97497b55fdf42b06;hpb=e183503f954cd8cf5640f933f308c310db88456c;p=scpubgit%2FDKit.git diff --git a/t/dot_ssh.t b/t/dot_ssh.t index 6e0a1c6..1c752a7 100644 --- a/t/dot_ssh.t +++ b/t/dot_ssh.t @@ -4,6 +4,7 @@ use DX::Solver; use DX::SetOver; use DX::Observer::FromCode; use DX::Action::FromCode; +use File::Spec; use Test::Exception; { @@ -39,6 +40,9 @@ my %protos = ( my %empty = ( '.ssh' => My::PathStatus->new( path => '.ssh' + ), + '.ssh/authorized_keys' => My::PathStatus->new( + path => '.ssh/authorized_keys' ) ); @@ -75,7 +79,7 @@ $solver->add_rule(@$_) for ( %path_status = %protos; sub paths_for_simple { - join ' ', map $_->{PS}->bound_value->path, $solver->query( + join ' ', map $_->value_for('PS')->path, $solver->query( [ qw(PS) ], [ path_status => 'PS' ], @_ )->results; } @@ -127,7 +131,7 @@ lives_ok { )->results }; -is(join(' ', map $_->{PS}->bound_value->path, @res), '.ssh'); +is(join(' ', map $_->value_for('PS')->path, @res), '.ssh'); delete $solver->rule_set->rules->{'path_status_at/2'}; @@ -159,7 +163,7 @@ $solver->add_rule( $ob_res{'.ssh'} = $protos{'.ssh'}; sub paths_for { - join ' ', map $_->{PS}->bound_value->path, $solver->query([ 'PS' ], @_)->results; + join ' ', map $_->value_for('PS')->path, $solver->query([ 'PS' ], @_)->results; } is( @@ -198,6 +202,9 @@ $solver->add_rule(@$_) for ( [ directory_at => [ qw(PS P) ], [ path_status_at => qw(PS P) ], [ is_directory => 'PS' ] ], + [ file_at => [ qw(PS P) ], + [ path_status_at => qw(PS P) ], + [ is_file => 'PS' ] ], ); %path_status = (); @@ -251,7 +258,9 @@ is(scalar(@res),1,'Single result'); is($path_status{'.ssh'}, $empty{'.ssh'}, 'Empty observed'); -ok(my $action = $res[0]->{PS}->action); +is( + scalar(my ($action) = $res[0]->actions), 1 +); my ($type, $value) = $action->run; @@ -265,6 +274,96 @@ is(scalar(@res),1,'Single result'); is($path_status{'.ssh'}, $protos{'.ssh'}, 'Created observed'); -ok(!$res[0]->{PS}->action, 'No action'); +ok(!$res[0]->actions, 'No action'); + +$solver->add_rule(@$_) for ( + [ catfile => [ qw(DirPath FileName FilePath) ], + DX::Op::FromCode->new(code => sub { + my ($self, $state) = @_; + my ($dir_path, $file_name, $file_path) + = map $state->scope_var($_), qw(DirPath FileName FilePath); + die "No." unless $dir_path->is_bound; + die "No." unless $file_name->is_bound; + die "No." if $file_path->is_bound; + my $cat_file = File::Spec->catfile( + map $_->bound_value, $dir_path, $file_name + ); + $state->bind_value($file_path->id, $cat_file) + ->add_dependencies( + $file_path->id => $dir_path->id, + $file_path->id => $file_name->id, + ) + ->then($self->next); + }) ], + [ file_in => [ qw(DirStatus FileName FileStatus) ], + [ is_directory => qw(DirStatus) ], + [ exists => [ qw(DirPath) ], + [ path => qw(DirStatus DirPath) ], + [ exists => [ qw(FilePath) ], + [ catfile => qw(DirPath FileName FilePath) ], + [ file_at => qw(FileStatus FilePath) ] ] ] ], + [ is_file => [ qw(PS) ], + [ not => [ exists_path => 'PS' ] ], + [ act => [ 'PS' ], + sub { + my ($ps_var) = @_; + my ($id, $value) = ($ps_var->id, $ps_var->bound_value); + DX::Action::FromCode->new( + expect => sub { + ($id => My::PathStatus->new( + path => $value->path, + info => My::PathStatusInfo->new( + is_file => 1, mode => '' + ) + )) + }, + perform => sub { + $ob_res{$value->path} = $protos{$value->path}; + (path_status => $value); + } + ) + } ] ] +); + +%path_status = (); +%ob_res = %empty; + +sub keys_file { + $solver->query([ qw(D F) ], + [ directory_at => 'D' => \'.ssh' ], + [ file_in => 'D' => \'authorized_keys' => 'F' ], + ); +} + +@res = keys_file()->results; + +is(scalar @res, 1, 'One result'); + +is(scalar(my @act = $res[0]->actions), 2, 'Two actions'); + +is(scalar(my ($poss) = grep !@{$_->dependencies}, @act), 1, 'One possible'); + +($type, $value) = $poss->run; + +$solver->facts->{$type}->remove_value($value); + +@res = keys_file()->results; + +is(scalar @res, 1, 'One result'); + +is( + scalar(($poss) = grep !@{$_->dependencies}, $res[0]->actions), 1, + 'One possible' +); + +($type, $value) = $poss->run; + +$solver->facts->{$type}->remove_value($value); + +@res = keys_file()->results; + +is(scalar @res, 1, 'One result'); + +is(scalar($res[0]->actions), 0, 'No actions'); done_testing;