Massive cleanup of DateTime test dependencies, other interim
[dbsrgits/DBIx-Class.git] / t / 99dbic_sqlt_parser.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use Test::Exception;
6 use Scalar::Util ();
7
8 BEGIN {
9   require DBIx::Class;
10   plan skip_all =>
11       'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for ('deploy')
12     unless DBIx::Class::Optional::Dependencies->req_ok_for ('deploy')
13 }
14
15 use lib qw(t/lib);
16 use DBICTest;
17 use DBICTest::Schema;
18
19 # Test for SQLT-related leaks
20 {
21   my $s = DBICTest::Schema->clone;
22   my $sqlt_schema = create_schema ({ schema => $s });
23   Scalar::Util::weaken ($s);
24
25   ok (!$s, 'Schema not leaked');
26
27   isa_ok ($sqlt_schema, 'SQL::Translator::Schema', 'SQLT schema object produced');
28 }
29
30 # make sure classname-style works
31 lives_ok { isa_ok (create_schema ({ schema => 'DBICTest::Schema' }), 'SQL::Translator::Schema', 'SQLT schema object produced') };
32
33
34 my $schema = DBICTest->init_schema();
35 # Dummy was yanked out by the sqlt hook test
36 # CustomSql tests the horrific/deprecated ->name(\$sql) hack
37 # YearXXXXCDs are views
38 #
39 my @sources = grep
40   { $_ !~ /^ (?: Dummy | CustomSql | Year\d{4}CDs ) $/x }
41   $schema->sources
42 ;
43
44 my $idx_exceptions = {
45     'Artwork'       => -1,
46     'ForceForeign'  => -1,
47     'LinerNotes'    => -1,
48     'TwoKeys'       => -1, # TwoKeys has the index turned off on the rel def
49 };
50
51 {
52   my $sqlt_schema = create_schema({ schema => $schema, args => { parser_args => { } } });
53
54   foreach my $source_name (@sources) {
55     my $table = get_table($sqlt_schema, $schema, $source_name);
56
57     my $fk_count = scalar(grep { $_->type eq 'FOREIGN KEY' } $table->get_constraints);
58     $fk_count += $idx_exceptions->{$source_name} || 0;
59     my @indices = $table->get_indices;
60
61     my $index_count = scalar(@indices);
62     is($index_count, $fk_count, "correct number of indices for $source_name with no args");
63
64     for my $index (@indices) {
65         my $source = $schema->source($source_name);
66         my $pk_test = join("\x00", $source->primary_columns);
67         my $idx_test = join("\x00", $index->fields);
68         isnt ( $pk_test, $idx_test, "no additional index for the primary columns exists in $source_name");
69     }
70   }
71 }
72
73 {
74   my $sqlt_schema = create_schema({ schema => $schema, args => { parser_args => { add_fk_index => 1 } } });
75
76   foreach my $source_name (@sources) {
77     my $table = get_table($sqlt_schema, $schema, $source_name);
78
79     my $fk_count = scalar(grep { $_->type eq 'FOREIGN KEY' } $table->get_constraints);
80     $fk_count += $idx_exceptions->{$source_name} || 0;
81     my @indices = $table->get_indices;
82     my $index_count = scalar(@indices);
83     is($index_count, $fk_count, "correct number of indices for $source_name with add_fk_index => 1");
84   }
85 }
86
87 {
88   my $sqlt_schema = create_schema({ schema => $schema, args => { parser_args => { add_fk_index => 0 } } });
89
90   foreach my $source (@sources) {
91     my $table = get_table($sqlt_schema, $schema, $source);
92
93     my @indices = $table->get_indices;
94     my $index_count = scalar(@indices);
95     is($index_count, 0, "correct number of indices for $source with add_fk_index => 0");
96   }
97 }
98
99 {
100     {
101         package # hide from PAUSE
102             DBICTest::Schema::NoViewDefinition;
103
104         use base qw/DBICTest::BaseResult/;
105
106         __PACKAGE__->table_class('DBIx::Class::ResultSource::View');
107         __PACKAGE__->table('noviewdefinition');
108
109         1;
110     }
111
112     my $schema_invalid_view = $schema->clone;
113     $schema_invalid_view->register_class('NoViewDefinition', 'DBICTest::Schema::NoViewDefinition');
114
115     throws_ok { create_schema({ schema => $schema_invalid_view }) }
116         qr/view noviewdefinition is missing a view_definition/,
117         'parser detects views with a view_definition';
118 }
119
120 lives_ok (sub {
121   my $sqlt_schema = create_schema ({
122     schema => $schema,
123     args => {
124       parser_args => {
125         sources => ['CD']
126       },
127     },
128   });
129
130   is_deeply (
131     [$sqlt_schema->get_tables ],
132     ['cd'],
133     'sources limitng with relationships works',
134   );
135
136 });
137
138 done_testing;
139
140 sub create_schema {
141   my $args = shift;
142
143   my $schema = $args->{schema};
144   my $additional_sqltargs = $args->{args} || {};
145
146   my $sqltargs = {
147     add_drop_table => 1, 
148     ignore_constraint_names => 1,
149     ignore_index_names => 1,
150     %{$additional_sqltargs}
151   };
152
153   my $sqlt = SQL::Translator->new( $sqltargs );
154
155   $sqlt->parser('SQL::Translator::Parser::DBIx::Class');
156   return $sqlt->translate({ data => $schema }) || die $sqlt->error;
157 }
158
159 sub get_table {
160     my ($sqlt_schema, $schema, $source) = @_;
161
162     my $table_name = $schema->source($source)->from;
163     $table_name    = $$table_name if ref $table_name;
164
165     return $sqlt_schema->get_table($table_name);
166 }