override storage to access sth details
[dbsrgits/DBIx-Class-RowCountStatistics.git] / t / basic.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use FindBin;
6
7 BEGIN {
8     push @INC, "$FindBin::Bin/lib";
9 }
10
11 use TestSchema;
12 use CtrlO::DBIC::Cursor::RowCountStatistics;
13
14 our @_COMPLETE;
15
16 do {
17     package TestStats;
18     use parent 'DBIx::Class::Storage::Statistics';
19     sub new {
20         bless {}, shift;
21     }
22     sub query_start { }
23     sub query_end { }
24     sub query_complete {
25         my ($self, @args) = @_;
26         push @_COMPLETE, \@args;
27     }
28 };
29
30 my $schema = TestSchema->connect(
31     'dbi:SQLite:dbname=:memory:',
32     undef, undef,
33     {},
34     {
35         cursor_class => 'CtrlO::DBIC::Cursor::RowCountStatistics',
36     }
37 );
38 $schema->deploy();
39 $schema->storage->debugobj(TestStats->new);
40 $schema->storage->debug(1);
41
42 ok $schema, 'schema created';
43 is $schema->storage->cursor_class,
44     'CtrlO::DBIC::Cursor::RowCountStatistics',
45     'cursor_class set';
46
47 my $rs = $schema->resultset('Test');
48
49 subtest 'count with ->next' => sub {
50     local @_COMPLETE;
51     $rs->create({ id => $_ }) for 1..10;
52     do {
53         my $rows = $rs->search_rs;
54         is ref($rows->cursor), 'CtrlO::DBIC::Cursor::RowCountStatistics',
55             'resultset cursor';
56         1 while $rows->next;
57     };
58     is scalar(@_COMPLETE), 1, 'single complete call';
59     is $_COMPLETE[0][0], 10, 'full count';
60     ok length($_COMPLETE[0][1]), 'SQL was passed';
61     like $_COMPLETE[0][1], qr{SELECT}i, 'SQL contains SELECT';
62     $rs->delete;
63 };
64
65 subtest 'count with ->all' => sub {
66     local @_COMPLETE;
67     $rs->create({ id => $_ }) for 1..10;
68     do {
69         my $rows = $rs->search_rs;
70         is ref($rows->cursor), 'CtrlO::DBIC::Cursor::RowCountStatistics',
71             'resultset cursor';
72         my @all = $rows->all;
73     };
74     is scalar(@_COMPLETE), 1, 'single complete call';
75     is $_COMPLETE[0][0], 10, 'full count';
76     $rs->delete;
77 };
78
79 subtest 'empty' => sub {
80     local @_COMPLETE;
81     do {
82         my $rows = $rs->search_rs;
83         1 while $rows->next;
84     };
85     is scalar(@_COMPLETE), 1, 'single complete call';
86     is $_COMPLETE[0][0], 0, 'full count';
87 };
88
89 subtest 'no fetch' => sub {
90     local @_COMPLETE;
91     $rs->create({ id => $_ }) for 1..10;
92     do {
93         my $rows = $rs->search_rs;
94     };
95     is scalar(@_COMPLETE), 0, 'no complete calls';
96     $rs->delete;
97 };
98
99 done_testing;