Make sure storage classes use c3, just like the rest of dbic (tested on 5.8 as well)
[dbsrgits/DBIx-Class.git] / t / 746mssql.t
CommitLineData
c1cac633 1use strict;
b9a2c3a5 2use warnings;
c1cac633 3
4use Test::More;
5use lib qw(t/lib);
6use DBICTest;
b2d16f1f 7use DBIC::SqlMakerTest;
c1cac633 8
9my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_ODBC_${_}" } qw/DSN USER PASS/};
10
11plan skip_all => 'Set $ENV{DBICTEST_MSSQL_ODBC_DSN}, _USER and _PASS to run this test'
12 unless ($dsn && $user);
13
64c7c000 14plan tests => 25;
c1cac633 15
42e5b103 16my $schema = DBICTest::Schema->connect($dsn, $user, $pass);
c1cac633 17
8c0104fe 18{
19 no warnings 'redefine';
20 my $connect_count = 0;
21 my $orig_connect = \&DBI::connect;
22 local *DBI::connect = sub { $connect_count++; goto &$orig_connect };
23
24 $schema->storage->ensure_connected;
25
26 is( $connect_count, 1, 'only one connection made');
27}
9b3e916d 28
c1cac633 29isa_ok( $schema->storage, 'DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server' );
30
c5f77f6c 31$schema->storage->dbh_do (sub {
32 my ($storage, $dbh) = @_;
33 eval { $dbh->do("DROP TABLE artist") };
34 $dbh->do(<<'SQL');
c1cac633 35
c1cac633 36CREATE TABLE artist (
37 artistid INT IDENTITY NOT NULL,
a0dd8679 38 name VARCHAR(100),
39da2a2b 39 rank INT NOT NULL DEFAULT '13',
2eebd801 40 charfield CHAR(10) NULL,
c1cac633 41 primary key(artistid)
42)
43
c5f77f6c 44SQL
45
46});
47
c1cac633 48my %seen_id;
49
2eebd801 50# fresh $schema so we start unconnected
c6fc5645 51$schema = DBICTest::Schema->connect($dsn, $user, $pass);
2eebd801 52
c1cac633 53# test primary key handling
54my $new = $schema->resultset('Artist')->create({ name => 'foo' });
55ok($new->artistid > 0, "Auto-PK worked");
56
57$seen_id{$new->artistid}++;
58
59# test LIMIT support
60for (1..6) {
61 $new = $schema->resultset('Artist')->create({ name => 'Artist ' . $_ });
62 is ( $seen_id{$new->artistid}, undef, "id for Artist $_ is unique" );
63 $seen_id{$new->artistid}++;
64}
65
66my $it = $schema->resultset('Artist')->search( {}, {
67 rows => 3,
68 order_by => 'artistid',
69});
70
71is( $it->count, 3, "LIMIT count ok" );
72is( $it->next->name, "foo", "iterator->next ok" );
73$it->next;
74is( $it->next->name, "Artist 2", "iterator->next ok" );
75is( $it->next, undef, "next past end of resultset ok" );
76
b9a2c3a5 77$schema->storage->dbh_do (sub {
78 my ($storage, $dbh) = @_;
79 eval { $dbh->do("DROP TABLE Owners") };
80 eval { $dbh->do("DROP TABLE Books") };
81 $dbh->do(<<'SQL');
82
83
84CREATE TABLE Books (
85 id INT IDENTITY (1, 1) NOT NULL,
86 source VARCHAR(100),
87 owner INT,
88 title VARCHAR(10),
89 price INT NULL
90)
91
92CREATE TABLE Owners (
93 id INT IDENTITY (1, 1) NOT NULL,
42e5b103 94 name VARCHAR(100),
b9a2c3a5 95)
96
b9a2c3a5 97SQL
98
99});
100$schema->populate ('Owners', [
134a3bb9 101 [qw/id name /],
b9a2c3a5 102 [qw/1 wiggle/],
103 [qw/2 woggle/],
104 [qw/3 boggle/],
fc85215b 105 [qw/4 fREW/],
106 [qw/5 fRIOUX/],
107 [qw/6 fROOH/],
108 [qw/7 fRUE/],
109 [qw/8 fISMBoC/],
110 [qw/9 station/],
111 [qw/10 mirror/],
112 [qw/11 dimly/],
113 [qw/12 face_to_face/],
114 [qw/13 icarus/],
115 [qw/14 dream/],
116 [qw/15 dyrstyggyr/],
b9a2c3a5 117]);
118
119$schema->populate ('BooksInLibrary', [
120 [qw/source owner title /],
56d2561e 121 [qw/Library 1 secrets0/],
b9a2c3a5 122 [qw/Library 1 secrets1/],
123 [qw/Eatery 1 secrets2/],
124 [qw/Library 2 secrets3/],
fc85215b 125 [qw/Library 3 secrets4/],
126 [qw/Eatery 3 secrets5/],
127 [qw/Library 4 secrets6/],
128 [qw/Library 5 secrets7/],
129 [qw/Eatery 5 secrets8/],
130 [qw/Library 6 secrets9/],
131 [qw/Library 7 secrets10/],
132 [qw/Eatery 7 secrets11/],
133 [qw/Library 8 secrets12/],
b9a2c3a5 134]);
135
136#
02d133f0 137# try a prefetch on tables with identically named columns
b9a2c3a5 138#
139
02d133f0 140# set quote char - make sure things work while quoted
141$schema->storage->_sql_maker->{quote_char} = [qw/[ ]/];
142$schema->storage->_sql_maker->{name_sep} = '.';
143
b9a2c3a5 144{
42e5b103 145 # try a ->has_many direction (group_by is not possible on has_many with limit)
fc85215b 146 my $owners = $schema->resultset ('Owners')->search ({
147 'books.id' => { '!=', undef }
148 }, {
149 prefetch => 'books',
ff1ef65b 150 order_by => 'name',
56d2561e 151 rows => 3, # 8 results total
fc85215b 152 });
153
56d2561e 154 is ($owners->page(1)->all, 3, 'has_many prefetch returns correct number of rows');
155 is ($owners->page(1)->count, 3, 'has-many prefetch returns correct count');
156
618a0fe3 157 TODO: {
158 local $TODO = 'limit past end of resultset problem';
56d2561e 159 is ($owners->page(3)->all, 2, 'has_many prefetch returns correct number of rows');
160 is ($owners->page(3)->count, 2, 'has-many prefetch returns correct count');
64c7c000 161 is ($owners->page(3)->count_rs->next, 2, 'has-many prefetch returns correct count_rs');
162
163 # make sure count does not become overly complex FIXME
164 is_same_sql_bind (
165 $owners->page(3)->count_rs->as_query,
166 '(
167 SELECT COUNT( * )
168 FROM (
02d133f0 169 SELECT TOP 3 [me].[id]
170 FROM [owners] [me]
171 LEFT JOIN [books] [books] ON [books].[owner] = [me].[id]
172 WHERE ( [books].[id] IS NOT NULL )
173 GROUP BY [me].[id]
174 ORDER BY [me].[id] DESC
175 ) [count_subq]
64c7c000 176 )',
177 [],
178 );
618a0fe3 179 }
b9a2c3a5 180
42e5b103 181 # try a ->belongs_to direction (no select collapse, group_by should work)
fc85215b 182 my $books = $schema->resultset ('BooksInLibrary')->search ({
56d2561e 183 'owner.name' => [qw/wiggle woggle/],
fc85215b 184 }, {
fc85215b 185 distinct => 1,
42e5b103 186 prefetch => 'owner',
ff1ef65b 187 order_by => 'name',
56d2561e 188 rows => 2, # 3 results total
fc85215b 189 });
190
b1e1d073 191
56d2561e 192 is ($books->page(1)->all, 2, 'Prefetched grouped search returns correct number of rows');
193 is ($books->page(1)->count, 2, 'Prefetched grouped search returns correct count');
b1e1d073 194
618a0fe3 195 TODO: {
196 local $TODO = 'limit past end of resultset problem';
56d2561e 197 is ($books->page(2)->all, 1, 'Prefetched grouped search returns correct number of rows');
198 is ($books->page(2)->count, 1, 'Prefetched grouped search returns correct count');
64c7c000 199 is ($books->page(2)->count_rs->next, 1, 'Prefetched grouped search returns correct count_rs');
200
201 # make sure count does not become overly complex FIXME
202 is_same_sql_bind (
203 $books->page(2)->count_rs->as_query,
204 '(
205 SELECT COUNT( * )
206 FROM (
02d133f0 207 SELECT TOP 2 [me].[id]
208 FROM [books] [me]
209 JOIN [owners] [owner] ON [owner].[id] = [me].[owner]
210 WHERE ( ( ( [owner].[name] = ? OR [owner].[name] = ? ) AND [source] = ? ) )
211 GROUP BY [me].[id], [me].[source], [me].[owner], [me].[title], [me].[price], [owner].[id], [owner].[name]
212 ORDER BY [me].[id] DESC
213 ) [count_subq]
64c7c000 214 )',
215 [
216 [ 'owner.name' => 'wiggle' ],
217 [ 'owner.name' => 'woggle' ],
218 [ 'source' => 'Library' ],
219 ],
220 );
618a0fe3 221 }
b2d16f1f 222
b9a2c3a5 223}
c1cac633 224
225# clean up our mess
226END {
c5f77f6c 227 my $dbh = eval { $schema->storage->_dbh };
c1cac633 228 $dbh->do('DROP TABLE artist') if $dbh;
229}
fc85215b 230# vim:sw=2 sts=2