ce3d27e7743546ac57833cb5d12f7dee3fc8e547
[dbsrgits/DBIx-Class.git] / t / admin / 10script.t
1 # vim: filetype=perl
2 use strict;
3 use warnings;
4
5 use Test::More;
6 use Config;
7 use lib qw(t/lib);
8 $ENV{PERL5LIB} = join ($Config{path_sep}, @INC);
9 use DBICTest;
10
11
12 BEGIN {
13     require DBIx::Class;
14     plan skip_all => 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for('admin_script')
15       unless DBIx::Class::Optional::Dependencies->req_ok_for('admin_script');
16 }
17
18 my @json_backends = qw/XS JSON DWIW/;
19
20 # test the script is setting @INC properly
21 test_exec (qw|-It/lib/testinclude --schema=DBICTestAdminInc --connect=[] --insert|);
22 cmp_ok ( $? >> 8, '==', 70, 'Correct exit code from connecting a custom INC schema' );
23
24 # test that config works properly
25 {
26   no warnings 'qw';
27   test_exec(qw|-It/lib/testinclude --schema=DBICTestConfig --create --connect=["klaatu","barada","nikto"]|);
28   cmp_ok( $? >> 8, '==', 71, 'Correct schema loaded via config' ) || exit;
29 }
30
31 # test that config-file works properly
32 test_exec(qw|-It/lib/testinclude --schema=DBICTestConfig --config=t/lib/admincfgtest.json --config-stanza=Model::Gort --deploy|);
33 cmp_ok ($? >> 8, '==', 71, 'Correct schema loaded via testconfig');
34
35 for my $js (@json_backends) {
36
37     eval {JSON::Any->import ($js) };
38     SKIP: {
39         skip ("JSON backend $js is not available, skip testing", 1) if $@;
40
41         $ENV{JSON_ANY_ORDER} = $js;
42         eval { test_dbicadmin () };
43         diag $@ if $@;
44     }
45 }
46
47 done_testing();
48
49 sub test_dbicadmin {
50     my $schema = DBICTest->init_schema( sqlite_use_file => 1 );  # reinit a fresh db for every run
51
52     my $employees = $schema->resultset('Employee');
53
54     test_exec( default_args(), qw|--op=insert --set={"name":"Matt"}| );
55     ok( ($employees->count()==1), "$ENV{JSON_ANY_ORDER}: insert count" );
56
57     my $employee = $employees->find(1);
58     ok( ($employee->name() eq 'Matt'), "$ENV{JSON_ANY_ORDER}: insert valid" );
59
60     test_exec( default_args(), qw|--op=update --set={"name":"Trout"}| );
61     $employee = $employees->find(1);
62     ok( ($employee->name() eq 'Trout'), "$ENV{JSON_ANY_ORDER}: update" );
63
64     test_exec( default_args(), qw|--op=insert --set={"name":"Aran"}| );
65
66     SKIP: {
67         skip ("MSWin32 doesn't support -| either", 1) if $^O eq 'MSWin32';
68
69         open(my $fh, "-|",  ( $^X, 'script/dbicadmin', default_args(), qw|--op=select --attrs={"order_by":"name"}| ) ) or die $!;
70         my $data = do { local $/; <$fh> };
71         close($fh);
72         if (!ok( ($data=~/Aran.*Trout/s), "$ENV{JSON_ANY_ORDER}: select with attrs" )) {
73           diag ("data from select is $data")
74         };
75     }
76
77     test_exec( default_args(), qw|--op=delete --where={"name":"Trout"}| );
78     ok( ($employees->count()==1), "$ENV{JSON_ANY_ORDER}: delete" );
79 }
80
81 sub default_args {
82   return (
83     qw|--quiet --schema=DBICTest::Schema --class=Employee|,
84     q|--connect=["dbi:SQLite:dbname=t/var/DBIxClass.db","","",{"AutoCommit":1}]|,
85     qw|--force -I testincludenoniterference|,
86   );
87 }
88
89 # Why do we need this crap? Apparently MSWin32 can not pass through quotes properly
90 # (sometimes it will and sometimes not, depending on what compiler was used to build
91 # perl). So we go the extra mile to escape all the quotes. We can't also use ' instead
92 # of ", because JSON::XS (proudly) does not support "malformed JSON" as the author
93 # calls it. Bleh.
94 #
95 sub test_exec {
96   my $perl = $^X;
97
98   my @args = ('script/dbicadmin', @_);
99
100   if ( $^O eq 'MSWin32' ) {
101     $perl = qq|"$perl"|;    # execution will fail if $^X contains paths
102     for (@args) {
103       $_ =~ s/"/\\"/g;
104     }
105   }
106
107   system ($perl, @args);
108 }