updated _resolve_column_source to _resolve_column_info as per ribasushi's suggestion
[dbsrgits/DBIx-Class-Historic.git] / t / 746mssql.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use lib qw(t/lib);
6 use DBICTest;
7
8 my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MSSQL_ODBC_${_}" } qw/DSN USER PASS/};
9
10 plan skip_all => 'Set $ENV{DBICTEST_MSSQL_ODBC_DSN}, _USER and _PASS to run this test'
11   unless ($dsn && $user);
12
13 plan tests => 21;
14
15 my $schema = DBICTest::Schema->connect($dsn, $user, $pass, {AutoCommit => 1});
16
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 }
27
28 isa_ok( $schema->storage, 'DBIx::Class::Storage::DBI::ODBC::Microsoft_SQL_Server' );
29
30 $schema->storage->dbh_do (sub {
31     my ($storage, $dbh) = @_;
32     eval { $dbh->do("DROP TABLE artist") };
33     $dbh->do(<<'SQL');
34
35 CREATE TABLE artist (
36    artistid INT IDENTITY NOT NULL,
37    name VARCHAR(100),
38    rank INT NOT NULL DEFAULT '13',
39    charfield CHAR(10) NULL,
40    primary key(artistid)
41 )
42
43 SQL
44
45 });
46
47 my %seen_id;
48
49 # fresh $schema so we start unconnected
50 $schema = DBICTest::Schema->connect($dsn, $user, $pass, {AutoCommit => 1});
51
52 # test primary key handling
53 my $new = $schema->resultset('Artist')->create({ name => 'foo' });
54 ok($new->artistid > 0, "Auto-PK worked");
55
56 $seen_id{$new->artistid}++;
57
58 # test LIMIT support
59 for (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
65 my $it = $schema->resultset('Artist')->search( {}, {
66     rows => 3,
67     order_by => 'artistid',
68 });
69
70 is( $it->count, 3, "LIMIT count ok" );
71 is( $it->next->name, "foo", "iterator->next ok" );
72 $it->next;
73 is( $it->next->name, "Artist 2", "iterator->next ok" );
74 is( $it->next, undef, "next past end of resultset ok" );
75
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
83 CREATE 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
91 CREATE TABLE Owners (
92    id INT IDENTITY (1, 1) NOT NULL,
93    [name] VARCHAR(100),
94 )
95
96 SET IDENTITY_INSERT Owners ON
97
98 SQL
99
100 });
101 $schema->populate ('Owners', [
102   [qw/id  [name]  /],
103   [qw/1   wiggle/],
104   [qw/2   woggle/],
105   [qw/3   boggle/],
106   [qw/4   fREW/],
107   [qw/5   fRIOUX/],
108   [qw/6   fROOH/],
109   [qw/7   fRUE/],
110   [qw/8   fISMBoC/],
111   [qw/9   station/],
112   [qw/10   mirror/],
113   [qw/11   dimly/],
114   [qw/12   face_to_face/],
115   [qw/13   icarus/],
116   [qw/14   dream/],
117   [qw/15   dyrstyggyr/],
118 ]);
119
120 $schema->populate ('BooksInLibrary', [
121   [qw/source  owner title   /],
122   [qw/Library 1     secrets1/],
123   [qw/Eatery  1     secrets2/],
124   [qw/Library 2     secrets3/],
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/],
134 ]);
135
136 #
137 # try a distinct + prefetch on tables with identically named columns
138 #
139
140 {
141   # try a ->has_many direction (due to a 'multi' accessor the select/group_by group is collapsed)
142   my $owners = $schema->resultset ('Owners')->search ({
143       'books.id' => { '!=', undef }
144     }, {
145       prefetch => 'books',
146       distinct => 1,
147       order_by => 'name',
148       page     => 2,
149       rows     => 5,
150     });
151
152   my $owners2 = $schema->resultset ('Owners')->search ({ id => { -in => $owners->get_column ('me.id')->as_query }});
153   for ($owners, $owners2) {
154     is ($_->all, 2, 'Prefetched grouped search returns correct number of rows');
155     is ($_->count, 2, 'Prefetched grouped search returns correct count');
156   }
157
158   # try a ->belongs_to direction (no select collapse)
159   my $books = $schema->resultset ('BooksInLibrary')->search ({
160       'owner.name' => 'wiggle'
161     }, {
162       prefetch => 'owner',
163       distinct => 1,
164       order_by => 'name',
165       page     => 2,
166       rows     => 5,
167     });
168
169   my $books2 = $schema->resultset ('BooksInLibrary')->search ({ id => { -in => $books->get_column ('me.id')->as_query }});
170   for ($books, $books2) {
171     is ($_->all, 1, 'Prefetched grouped search returns correct number of rows');
172     is ($_->count, 1, 'Prefetched grouped search returns correct count');
173   }
174
175   #my $result = $schema->resultset('BooksInLibrary')->search(undef, {
176         #page     => 1,
177         #rows     => 25,
178         #order_by => ['name', 'title'],
179         #prefetch => 'owner'
180      #})->first;
181
182 }
183
184 # clean up our mess
185 END {
186     my $dbh = eval { $schema->storage->_dbh };
187     $dbh->do('DROP TABLE artist') if $dbh;
188 }
189 # vim:sw=2 sts=2