Really fix tests
[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;
7
8my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_ODBC_${_}" } qw/DSN USER PASS/};
9
10plan skip_all => 'Set $ENV{DBICTEST_MSSQL_ODBC_DSN}, _USER and _PASS to run this test'
11 unless ($dsn && $user);
12
56d2561e 13plan tests => 21;
c1cac633 14
42e5b103 15my $schema = DBICTest::Schema->connect($dsn, $user, $pass);
c1cac633 16
8c0104fe 17{
18 no warnings 'redefine';
19 my $connect_count = 0;
20 my $orig_connect = \&DBI::connect;
21 local *DBI::connect = sub { $connect_count++; goto &$orig_connect };
22
23 $schema->storage->ensure_connected;
24
25 is( $connect_count, 1, 'only one connection made');
26}
9b3e916d 27
c1cac633 28isa_ok( $schema->storage, 'DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server' );
29
c5f77f6c 30$schema->storage->dbh_do (sub {
31 my ($storage, $dbh) = @_;
32 eval { $dbh->do("DROP TABLE artist") };
33 $dbh->do(<<'SQL');
c1cac633 34
c1cac633 35CREATE TABLE artist (
36 artistid INT IDENTITY NOT NULL,
a0dd8679 37 name VARCHAR(100),
39da2a2b 38 rank INT NOT NULL DEFAULT '13',
2eebd801 39 charfield CHAR(10) NULL,
c1cac633 40 primary key(artistid)
41)
42
c5f77f6c 43SQL
44
45});
46
c1cac633 47my %seen_id;
48
2eebd801 49# fresh $schema so we start unconnected
c6fc5645 50$schema = DBICTest::Schema->connect($dsn, $user, $pass);
2eebd801 51
c1cac633 52# test primary key handling
53my $new = $schema->resultset('Artist')->create({ name => 'foo' });
54ok($new->artistid > 0, "Auto-PK worked");
55
56$seen_id{$new->artistid}++;
57
58# test LIMIT support
59for (1..6) {
60 $new = $schema->resultset('Artist')->create({ name => 'Artist ' . $_ });
61 is ( $seen_id{$new->artistid}, undef, "id for Artist $_ is unique" );
62 $seen_id{$new->artistid}++;
63}
64
65my $it = $schema->resultset('Artist')->search( {}, {
66 rows => 3,
67 order_by => 'artistid',
68});
69
70is( $it->count, 3, "LIMIT count ok" );
71is( $it->next->name, "foo", "iterator->next ok" );
72$it->next;
73is( $it->next->name, "Artist 2", "iterator->next ok" );
74is( $it->next, undef, "next past end of resultset ok" );
75
b9a2c3a5 76$schema->storage->dbh_do (sub {
77 my ($storage, $dbh) = @_;
78 eval { $dbh->do("DROP TABLE Owners") };
79 eval { $dbh->do("DROP TABLE Books") };
80 $dbh->do(<<'SQL');
81
82
83CREATE TABLE Books (
84 id INT IDENTITY (1, 1) NOT NULL,
85 source VARCHAR(100),
86 owner INT,
87 title VARCHAR(10),
88 price INT NULL
89)
90
91CREATE TABLE Owners (
92 id INT IDENTITY (1, 1) NOT NULL,
42e5b103 93 name VARCHAR(100),
b9a2c3a5 94)
95
b9a2c3a5 96SQL
97
98});
99$schema->populate ('Owners', [
134a3bb9 100 [qw/id name /],
b9a2c3a5 101 [qw/1 wiggle/],
102 [qw/2 woggle/],
103 [qw/3 boggle/],
fc85215b 104 [qw/4 fREW/],
105 [qw/5 fRIOUX/],
106 [qw/6 fROOH/],
107 [qw/7 fRUE/],
108 [qw/8 fISMBoC/],
109 [qw/9 station/],
110 [qw/10 mirror/],
111 [qw/11 dimly/],
112 [qw/12 face_to_face/],
113 [qw/13 icarus/],
114 [qw/14 dream/],
115 [qw/15 dyrstyggyr/],
b9a2c3a5 116]);
117
118$schema->populate ('BooksInLibrary', [
119 [qw/source owner title /],
56d2561e 120 [qw/Library 1 secrets0/],
b9a2c3a5 121 [qw/Library 1 secrets1/],
122 [qw/Eatery 1 secrets2/],
123 [qw/Library 2 secrets3/],
fc85215b 124 [qw/Library 3 secrets4/],
125 [qw/Eatery 3 secrets5/],
126 [qw/Library 4 secrets6/],
127 [qw/Library 5 secrets7/],
128 [qw/Eatery 5 secrets8/],
129 [qw/Library 6 secrets9/],
130 [qw/Library 7 secrets10/],
131 [qw/Eatery 7 secrets11/],
132 [qw/Library 8 secrets12/],
b9a2c3a5 133]);
134
135#
136# try a distinct + prefetch on tables with identically named columns
137#
138
139{
c6fc5645 140$schema->debug (1);
42e5b103 141 # try a ->has_many direction (group_by is not possible on has_many with limit)
fc85215b 142 my $owners = $schema->resultset ('Owners')->search ({
143 'books.id' => { '!=', undef }
144 }, {
145 prefetch => 'books',
ff1ef65b 146 order_by => 'name',
56d2561e 147 rows => 3, # 8 results total
fc85215b 148 });
149
56d2561e 150 is ($owners->page(1)->all, 3, 'has_many prefetch returns correct number of rows');
151 is ($owners->page(1)->count, 3, 'has-many prefetch returns correct count');
152
618a0fe3 153 TODO: {
154 local $TODO = 'limit past end of resultset problem';
56d2561e 155 is ($owners->page(3)->all, 2, 'has_many prefetch returns correct number of rows');
156 is ($owners->page(3)->count, 2, 'has-many prefetch returns correct count');
618a0fe3 157 }
b9a2c3a5 158
42e5b103 159 # try a ->belongs_to direction (no select collapse, group_by should work)
fc85215b 160 my $books = $schema->resultset ('BooksInLibrary')->search ({
56d2561e 161 'owner.name' => [qw/wiggle woggle/],
fc85215b 162 }, {
fc85215b 163 distinct => 1,
42e5b103 164 prefetch => 'owner',
ff1ef65b 165 order_by => 'name',
56d2561e 166 rows => 2, # 3 results total
fc85215b 167 });
168
b1e1d073 169
56d2561e 170 is ($books->page(1)->all, 2, 'Prefetched grouped search returns correct number of rows');
171 is ($books->page(1)->count, 2, 'Prefetched grouped search returns correct count');
b1e1d073 172
618a0fe3 173 TODO: {
174 local $TODO = 'limit past end of resultset problem';
56d2561e 175 is ($books->page(2)->all, 1, 'Prefetched grouped search returns correct number of rows');
176 is ($books->page(2)->count, 1, 'Prefetched grouped search returns correct count');
618a0fe3 177 }
b9a2c3a5 178}
c1cac633 179
180# clean up our mess
181END {
c5f77f6c 182 my $dbh = eval { $schema->storage->_dbh };
c1cac633 183 $dbh->do('DROP TABLE artist') if $dbh;
184}
fc85215b 185# vim:sw=2 sts=2