File Coverage

blib/lib/Test/Clustericious/Config.pm
Criterion Covered Total %
statement 106 108 98.1
branch 10 12 83.3
condition 6 17 35.2
subroutine 19 19 100.0
pod 4 4 100.0
total 145 160 90.6


line stmt bran cond sub pod time code
1             package Test::Clustericious::Config;
2              
3 20     20   182352 use strict;
  20         148  
  20         516  
4 20     20   96 use warnings;
  20         34  
  20         546  
5 20     20   387 use 5.010001;
  20         61  
6 20     20   4808 use Test2::Plugin::FauxHomeDir;
  20         1130097  
  20         129  
7 20     20   30248 use File::Glob qw( bsd_glob );
  20         48  
  20         1675  
8 20     20   4866 use YAML::XS qw( DumpFile );
  20         38287  
  20         959  
9 20     20   135 use File::Path qw( mkpath );
  20         39  
  20         871  
10 20     20   5688 use Clustericious::Config;
  20         73  
  20         543  
11 20     20   4601 use Mojo::Loader;
  20         19719  
  20         822  
12 20     20   138 use Clustericious;
  20         39  
  20         458  
13 20     20   97 use Test2::API qw( context );
  20         39  
  20         916  
14 20     20   107 use base qw( Exporter );
  20         34  
  20         3207  
15              
16             our @EXPORT = qw( create_config_ok create_directory_ok home_directory_ok create_config_helper_ok );
17             our @EXPORT_OK = @EXPORT;
18             our %EXPORT_TAGS = ( all => \@EXPORT );
19              
20             my $config_dir;
21              
22             sub _init
23             {
24 20     20   903 $config_dir = bsd_glob('~/etc');
25 20         1897 mkdir $config_dir;
26              
27 20         171 $ENV{CLUSTERICIOUS_CONF_DIR} = $config_dir;
28 20         132 Clustericious->_testing(1);
29             }
30              
31 20     20   81 BEGIN { _init() }
32              
33             # ABSTRACT: Test Clustericious::Config
34             our $VERSION = '1.27'; # VERSION
35              
36              
37             sub create_config_ok ($;$$)
38             {
39 28     28 1 24184 my($config_name, $config, $test_name) = @_;
40              
41 28         90 my $fn = "$config_name.conf";
42 28         146 $fn =~ s/::/-/g;
43            
44 28 100       96 unless(defined $config)
45             {
46 7         18 my $caller = caller;
47 7 50       21 Mojo::Loader::load_class($caller) unless $caller eq 'main';
48 7         37 $config = Mojo::Loader::data_section($caller, "etc/$fn");
49             }
50            
51 28         466 my @diag;
52             my $config_filename;
53            
54 28         101 my $ctx = context();
55 28         2504 my $ok = 1;
56 28 100       112 if(!defined $config)
57             {
58 1         4 $config = "---\n";
59 1         6 push @diag, "unable to locate text for $config_name";
60 1         4 $ok = 0;
61 1   33     8 $test_name //= "create config for $config_name";
62             }
63             else
64             {
65 27         89 $config_filename = "$config_dir/$fn";
66            
67 27         53 eval {
68 27 100       68 if(ref $config)
69             {
70 7         30 DumpFile($config_filename, $config);
71             }
72             else
73             {
74 20         5635 open my $fh, '>', $config_filename;
75 20         201 print $fh $config;
76 20         713 close $fh;
77             }
78             };
79 27 50       1619 if(my $error = $@)
80             {
81 0         0 $ok = 0;
82 0         0 push @diag, "exception: $error";
83             }
84            
85 27   33     221 $test_name //= "create config for $config_name at $config_filename";
86            
87             # remove any cached copy if necessary
88 27         192 Clustericious->_config_uncache($config_name);
89             }
90              
91 28         143 $ctx->ok($ok, $test_name);
92 28         6066 $ctx->diag($_) for @diag;
93            
94 28         234 $ctx->release;
95            
96 28         797 return $config_filename;
97             }
98              
99              
100             sub create_directory_ok ($;$)
101             {
102 3     3 1 4301 my($path, $test_name) = @_;
103              
104 3         6 my $fullpath;
105             my $ok;
106            
107 3 100       10 if(defined $path)
108             {
109 2         4 $fullpath = $path;
110 2         7 $fullpath =~ s{^/}{};
111 2         79 $fullpath = bsd_glob("~/$fullpath");
112 2         515 mkpath $fullpath, 0, 0700;
113            
114 2   33     22 $test_name //= "create directory $fullpath";
115 2         16 $ok = -d $fullpath;
116             }
117             else
118             {
119 1   50     9 $test_name //= "create directory [undef]";
120 1         2 $ok = 0;
121             }
122            
123 3         10 my $ctx = context();
124 3         219 $ctx->ok($ok, $test_name);
125 3         539 $ctx->release;
126 3         66 return $fullpath;
127             }
128              
129              
130             sub home_directory_ok (;$)
131             {
132 3     3 1 3487 my($test_name) = @_;
133            
134 3         69 my $fullpath = bsd_glob('~');
135            
136 3   33     26 $test_name //= "home directory $fullpath";
137            
138 3         11 my $ctx = context();
139 3         269 $ctx->ok(-d $fullpath, $test_name);
140 3         426 $ctx->release;
141 3         77 return $fullpath;
142             }
143              
144              
145             sub create_config_helper_ok ($$;$)
146             {
147 2     2 1 2819 my($helper_name, $helper_code, $test_name) = @_;
148            
149 2   33     19 $test_name //= "create config helper $helper_name";
150 2         4 my $ok = 1;
151            
152 2         17 require Clustericious::Config::Helpers;
153 2         5 do {
154 20     20   136 no strict 'refs';
  20         42  
  20         1778  
155 2         4 *{"Clustericious::Config::Helpers::$helper_name"} = $helper_code;
  2         21  
156             };
157 2         8 push @Clustericious::Config::Helpers::EXPORT, $helper_name;
158            
159 2         6 my $ctx = context();
160 2         168 $ctx->ok($ok, $test_name);
161 2         215 $ctx->release;
162 2         51 return $ok;
163             }
164              
165             1;
166              
167             __END__
168              
169             =pod
170              
171             =encoding UTF-8
172              
173             =head1 NAME
174              
175             Test::Clustericious::Config - Test Clustericious::Config
176              
177             =head1 VERSION
178              
179             version 1.27
180              
181             =head1 SYNOPSIS
182              
183             use Test::Clustericious::Config;
184             use Clustericious::Config;
185             use Test::More tets => 2;
186            
187             create_config_ok 'Foo', { url => 'http://localhost:1234' };
188             my $config = Clustericious::Config->new('Foo');
189             is $config->url, "http://localhost:1234";
190              
191             To test against a Clustericious application MyApp:
192              
193             use Test::Clustericious::Config;
194             use Test::Clustericious;
195             use Test::More tests => 3;
196              
197             create_config_ok 'MyApp', { x => 1, y => 2 };
198             my $t = Test::Clustericious->new('MyApp');
199            
200             $t->get_ok('/');
201            
202             is $t->app->config->x, 1;
203              
204             To test against multiple Clustericious applications MyApp1, MyApp2
205             (can also be the same app with different config):
206              
207             use Test::Clustericious::Config;
208             use Test::Clustericious;
209             use Test::More tests => 4;
210            
211             create_config_ok 'MyApp1', {};
212             my $t1 = Test::Clustericious->new('MyApp1');
213            
214             $t1->get_ok('/');
215            
216             create_config_ok 'MyApp2', { my_app1_url => $t1->app_url };
217             my $t2 = Test::Clustericious->new('MyApp2');
218            
219             $t2->get_ok('/');
220              
221             =head1 DESCRIPTION
222              
223             This module provides an interface for testing Clustericious
224             configurations, or Clustericious applications which use
225             a Clustericious configuration.
226              
227             It uses L<Test2::Plugin::FauxHomeDir> to isolate your test environment
228             from any configurations you may have in your C<~/etc>. Keep
229             in mind that this means that C<$HOME> and friends will be in
230             a temporary directory and removed after the test runs. It also
231             means that the caveats for L<Test2::Plugin::FauxHomeDir> apply when
232             using this module as well (specifically this should be the first module
233             that you use in your test after C<use strict> and C<use warnings>).
234              
235             =head1 FUNCTIONS
236              
237             =head2 create_config_ok
238              
239             create_config_ok $name, $config;
240             create_config_ok $name, $config, $test_name;
241              
242             Create a Clustericious config with the given C<$name>.
243             If C<$config> is a reference then it will create the
244             configuration file with C<YAML::XS::DumpFile>, if
245             it is a scalar, it will will write the scalar out
246             to the config file. Thus these three examples should
247             create a config with the same values (though in different
248             formats):
249              
250             hash reference:
251              
252             create_config_ok 'Foo', { url => 'http://localhost:1234' }];
253              
254             YAML:
255              
256             create_config_ok 'Foo', <<EOF;
257             ---
258             url: http://localhost:1234
259             EOF
260              
261             JSON:
262              
263             create_config_ok 'Foo', <<EOF;
264             {"url":"http://localhost:1234"}
265             EOF
266              
267             In addition to being a test that will produce a ok/not ok
268             result as output, this function will return the full path
269             to the configuration file created.
270              
271             =head2 create_directory_ok
272              
273             create_directory_ok $path;
274             create_directory_ok $path, $test_name;
275              
276             Creates a directory in your test environment home directory.
277             This directory will be recursively removed when your test
278             terminates. This function returns the full path of the
279             directory created.
280              
281             =head2 home_directory_ok
282              
283             home_directory_ok;
284             home_directory_ok $test_name;
285              
286             Tests that the temp home directory has been created okay.
287             Returns the full path of the home directory.
288              
289             =head2 create_config_helper_ok
290              
291             create_config_helper_ok $helper_name, $helper_coderef;
292             create_config_helper_ok $helper_name, $helper_coderef, $test_name;
293              
294             Install a helper which can be called from within a configuration template.
295             Example:
296              
297             my $counter;
298             create_config_helper_ok 'counter', sub { $counter++ };
299             create_config_ok 'MyApp', <<EOF;
300             ---
301             one: <%= counter %>
302             two: <%= counter %>
303             three: <% counter %>
304             EOF
305              
306             =head1 EXAMPLES
307              
308             Here is an (abbreviated) example from L<Yars> that show how to test against an app
309             where you need to know the port/url of the app in the configuration
310             file:
311              
312             use Test::Mojo;
313             use Test::More tests => 1;
314             use Test::Clustericious::Config;
315             use Mojo::UserAgent;
316             use Yars;
317            
318             my $t = Test::Mojo->new;
319             $t->ua(do {
320             my $ua = Mojo::UserAgent->new;
321             create_config_ok 'Yars', {
322             url => $ua->app_url,
323             servers => [ {
324             url => $ua->app_url,
325             } ]
326             };
327             $ua->app(Yars->new);
328             $ua
329             };
330            
331             $t->get_ok('/status');
332              
333             To see the full tests see t/073_tempdir.t in the L<Yars> distribution.
334              
335             =head1 AUTHOR
336              
337             Original author: Brian Duggan
338              
339             Current maintainer: Graham Ollis E<lt>plicease@cpan.orgE<gt>
340              
341             Contributors:
342              
343             Curt Tilmes
344              
345             Yanick Champoux
346              
347             =head1 COPYRIGHT AND LICENSE
348              
349             This software is copyright (c) 2013 by NASA GSFC.
350              
351             This is free software; you can redistribute it and/or modify it under
352             the same terms as the Perl 5 programming language system itself.
353              
354             =cut