start of dot_ssh test
[scpubgit/DKit.git] / t / dot_ssh.t
1 use strictures 1;
2 use Test::More;
3 use DX::Solver;
4 use DX::SetOver;
5
6 {
7   package My::PathStatus;
8
9   use Moo;
10
11   has path => (is => 'ro', required => 1);
12   has info => (is => 'ro', required => 1);
13
14   package My::PathStatusInfo;
15
16   use Moo;
17
18   has is_directory => (is => 'ro', default => 0);
19   has is_file => (is => 'ro', default => 0);
20   has mode => (is => 'ro', required => 1);
21 }
22
23 @INC{qw(My/PathStatus.pm My/PathStatusInfo.pm)} = (__FILE__,__FILE__);
24
25 my %protos = (
26   '.ssh' => My::PathStatus->new(
27     path => '.ssh',
28     info => My::PathStatusInfo->new(is_directory => 1, mode => '0755')
29   ),
30   '.ssh/authorized_keys' => My::PathStatus->new(
31     path => '.ssh/authorized_keys',
32     info => My::PathStatusInfo->new(is_file => 1, mode => '0644')
33   ),
34 );
35
36 my %path_status;
37
38 my $solver = DX::Solver->new(
39   facts => { path_status => DX::SetOver->new(
40                over => 'path',
41                values => \%path_status,
42              ) },
43 );
44
45 my @rules = (
46   [ path_status => [ qw(PS) ],
47     [ member_of => 'PS', [ value => 'path_status' ] ] ],
48   [ path => [ qw(PS P) ],
49     [ constrain => [ qw(PS P) ], sub { $_[0]->path eq $_[1] } ] ],
50   [ mode => [ qw(PS M) ],
51     [ constrain => [ qw(PS M) ],
52        sub { $_[0]->info and $_[0]->info->mode eq $_[1] } ] ],
53   [ is_directory => [ qw(PS) ],
54     [ constrain => [ qw(PS) ],
55         sub { $_[0]->info and $_[0]->info->is_directory } ] ],
56   [ is_file => [ qw(PS) ],
57     [ constrain => [ qw(PS) ],
58         sub { $_[0]->info and $_[0]->info->is_file } ] ],
59 );
60
61 $solver->add_rule(@$_) for @rules;
62
63 %path_status = %protos;
64
65 sub paths_for {
66   join ' ', map $_->{PS}{path}, $solver->query(
67     [ qw(PS) ], [ path_status => 'PS'], @_
68   )->results;
69 }
70
71 is(paths_for(), '.ssh .ssh/authorized_keys');
72
73 is(paths_for([ is_directory => 'PS' ]), '.ssh');
74
75 is(paths_for([ is_file => 'PS' ]), '.ssh/authorized_keys');
76
77 is(paths_for([ mode => 'PS', [ value => '0755' ] ]), '.ssh');