Commit | Line | Data |
046e344c |
1 | use strict; |
05d322c8 |
2 | use warnings; |
3a89a69f |
3 | use Test::More; |
4 | use Test::Exception; |
05d322c8 |
5 | |
6 | # use this if you keep a copy of DBD::Sybase linked to FreeTDS somewhere else |
7 | BEGIN { |
8 | if (my $lib_dirs = $ENV{DBICTEST_MSSQL_PERL5LIB}) { |
9 | unshift @INC, $_ for split /:/, $lib_dirs; |
10 | } |
11 | } |
12 | |
046e344c |
13 | use lib qw(t/lib); |
14 | use dbixcsl_common_tests; |
15 | |
3a89a69f |
16 | my $dbd_sybase_dsn = $ENV{DBICTEST_MSSQL_DSN} || ''; |
17 | my $dbd_sybase_user = $ENV{DBICTEST_MSSQL_USER} || ''; |
18 | my $dbd_sybase_password = $ENV{DBICTEST_MSSQL_PASS} || ''; |
19 | |
20 | my $odbc_dsn = $ENV{DBICTEST_MSSQL_ODBC_DSN} || ''; |
21 | my $odbc_user = $ENV{DBICTEST_MSSQL_ODBC_USER} || ''; |
22 | my $odbc_password = $ENV{DBICTEST_MSSQL_ODBC_PASS} || ''; |
046e344c |
23 | |
24 | my $tester = dbixcsl_common_tests->new( |
b1e43108 |
25 | vendor => 'mssql', |
046e344c |
26 | auto_inc_pk => 'INTEGER IDENTITY NOT NULL PRIMARY KEY', |
41968729 |
27 | default_function => 'getdate()', |
28 | default_function_def => 'DATETIME DEFAULT getdate()', |
3a89a69f |
29 | connect_info => [ ($dbd_sybase_dsn ? { |
30 | dsn => $dbd_sybase_dsn, |
31 | user => $dbd_sybase_user, |
32 | password => $dbd_sybase_password, |
33 | } : ()), |
34 | ($odbc_dsn ? { |
35 | dsn => $odbc_dsn, |
36 | user => $odbc_user, |
37 | password => $odbc_password, |
38 | } : ()), |
39 | ], |
deedd576 |
40 | data_types => { |
41 | 'int identity' => { data_type => 'int', is_auto_increment => 1 }, |
42 | }, |
3a89a69f |
43 | extra => { |
44 | create => [ |
45 | q{ |
46 | CREATE TABLE [mssql_loader_test1.dot] ( |
47 | id INT IDENTITY NOT NULL PRIMARY KEY, |
48 | dat VARCHAR(8) |
49 | ) |
50 | }, |
51 | q{ |
52 | CREATE TABLE mssql_loader_test3 ( |
53 | id INT IDENTITY NOT NULL PRIMARY KEY |
54 | ) |
55 | }, |
56 | q{ |
57 | CREATE VIEW mssql_loader_test4 AS |
58 | SELECT * FROM mssql_loader_test3 |
59 | }, |
020f3c3a |
60 | # test capitalization of cols in unique constraints and rels |
ccce0e82 |
61 | q{ SET QUOTED_IDENTIFIER ON }, |
62 | q{ SET ANSI_NULLS ON }, |
deedd576 |
63 | q{ |
020f3c3a |
64 | CREATE TABLE [MSSQL_Loader_Test5] ( |
65 | [Id] INT IDENTITY NOT NULL PRIMARY KEY, |
ccce0e82 |
66 | [FooCol] INT NOT NULL, |
67 | [BarCol] INT NOT NULL, |
68 | UNIQUE ([FooCol], [BarCol]) |
deedd576 |
69 | ) |
70 | }, |
020f3c3a |
71 | q{ |
72 | CREATE TABLE [MSSQL_Loader_Test6] ( |
73 | [Five_Id] INT REFERENCES [MSSQL_Loader_Test5] ([Id]) |
74 | ) |
75 | }, |
3a89a69f |
76 | ], |
77 | pre_drop_ddl => [ |
78 | 'CREATE TABLE mssql_loader_test3 (id INT IDENTITY NOT NULL PRIMARY KEY)', |
79 | 'DROP VIEW mssql_loader_test4', |
80 | ], |
81 | drop => [ |
82 | '[mssql_loader_test1.dot]', |
deedd576 |
83 | 'mssql_loader_test3', |
84 | 'mssql_loader_test5', |
020f3c3a |
85 | 'mssql_loader_test6', |
3a89a69f |
86 | ], |
bfb43060 |
87 | count => 10, |
3a89a69f |
88 | run => sub { |
89 | my ($schema, $monikers, $classes) = @_; |
90 | |
91 | # Test that the table above (with '.' in name) gets loaded correctly. |
92 | ok((my $rs = eval { |
93 | $schema->resultset($monikers->{'[mssql_loader_test1.dot]'}) }), |
94 | 'got a resultset for table with dot in name'); |
95 | |
96 | ok((my $from = eval { $rs->result_source->from }), |
97 | 'got an $rsrc->from for table with dot in name'); |
98 | |
99 | is ref($from), 'SCALAR', '->table with dot in name is a scalar ref'; |
100 | |
101 | is eval { $$from }, "[mssql_loader_test1.dot]", |
102 | '->table with dot in name has correct name'; |
103 | |
deedd576 |
104 | # Test capitalization of columns and unique constraints |
105 | ok ((my $rsrc = $schema->resultset($monikers->{mssql_loader_test5})->result_source), |
106 | 'got result_source'); |
107 | |
bfb43060 |
108 | ## not anymore |
109 | # is $rsrc->name, 'mssql_loader_test5', |
110 | # 'table name is lowercased'; |
020f3c3a |
111 | |
112 | is_deeply [ $rsrc->columns ], [qw/id foocol barcol/], |
deedd576 |
113 | 'column names are lowercased'; |
3a89a69f |
114 | |
deedd576 |
115 | my %uniqs = $rsrc->unique_constraints; |
116 | delete $uniqs{primary}; |
3a89a69f |
117 | |
deedd576 |
118 | is_deeply ((values %uniqs)[0], [qw/foocol barcol/], |
119 | 'columns in unique constraint lowercased'); |
3a89a69f |
120 | |
020f3c3a |
121 | lives_and { |
122 | my $five_row = $schema->resultset($monikers->{mssql_loader_test5})->create({ foocol => 1, barcol => 2 }); |
123 | my $six_row = $five_row->create_related('mssql_loader_test6s', {}); |
124 | |
125 | is $six_row->five->id, 1; |
126 | } 'relationships for mixed-case tables/columns detected'; |
127 | |
3a89a69f |
128 | # Test that a bad view (where underlying table is gone) is ignored. |
129 | my $dbh = $schema->storage->dbh; |
130 | $dbh->do("DROP TABLE mssql_loader_test3"); |
131 | |
132 | my @warnings; |
133 | { |
134 | local $SIG{__WARN__} = sub { push @warnings, $_[0] }; |
135 | $schema->rescan; |
136 | } |
137 | ok ((grep /^Bad table or view 'mssql_loader_test4'/, @warnings), |
138 | 'bad view ignored'); |
139 | |
140 | throws_ok { |
141 | $schema->resultset($monikers->{mssql_loader_test4}) |
142 | } qr/Can't find source/, |
143 | 'no source registered for bad view'; |
144 | }, |
145 | }, |
046e344c |
146 | ); |
147 | |
3a89a69f |
148 | if(not ($dbd_sybase_dsn || $odbc_dsn)) { |
149 | $tester->skip_tests('You need to set the DBICTEST_MSSQL_DSN, _USER and _PASS and/or the DBICTEST_MSSQL_ODBC_DSN, _USER and _PASS environment variables'); |
046e344c |
150 | } |
151 | else { |
152 | $tester->run_tests(); |
153 | } |