base cache key on sql and binds plus dbname and username
[dbsrgits/DBIx-Class-Cursor-Cached.git] / t / simple.t
1 BEGIN {
2   package SchemaClass::CD;
3
4   use base qw(DBIx::Class::Core);
5
6   __PACKAGE__->table('cd');
7   __PACKAGE__->add_columns(
8     'id' => {
9       data_type => 'integer',
10       is_auto_increment => 1,
11     },
12     'title' => {
13       data_type => 'varchar',
14       size      => 100,
15     },
16   );
17   __PACKAGE__->set_primary_key('id');
18
19   package SchemaClass;
20
21   use base qw(DBIx::Class::Schema);
22
23   __PACKAGE__->register_class(CD => 'SchemaClass::CD');
24
25   sub deploy {
26     my $self = shift;
27     $self->storage->dbh->do(q{
28       CREATE TABLE cd (
29         id INTEGER PRIMARY KEY NOT NULL,
30         title varchar(100) NOT NULL
31       );
32     });
33   }
34
35   sub init {
36     my $self = shift;
37     $self->deploy;
38     $self->resultset('CD')->populate([
39       map { { title => $_ } } 'CD one', 'CD two'
40     ]);
41   }
42
43 }
44
45 use Cache::FileCache;
46 use DBIx::Class::Cursor::Cached;
47 use Test::More 'no_plan';
48
49 mkdir('t/var');
50 unlink('t/var/test.db');
51
52 my ($dsn, $user, $pass) = ('dbi:SQLite:t/var/test.db');
53
54 SchemaClass->connect($dsn,$user,$pass)->init;
55
56 my $expect_data = [ [ 1, 'CD one' ], [ 2, 'CD two' ] ];
57
58 { ## start test block
59
60   my $schema = SchemaClass->connect(
61     $dsn, $user, $pass, { cursor_class => 'DBIx::Class::Cursor::Cached' }
62   );
63
64   $schema->default_resultset_attributes({
65     cache_object => Cache::FileCache->new({ namespace => 'SchemaClass' }),
66   });
67
68 my $cache = $schema->default_resultset_attributes->{cache_object};
69
70   my $rs = $schema->resultset('CD')->search(undef, { cache_for => 300 });
71
72   my @cds = $rs->all; # fills cache
73
74 is_deeply([ map { [ $_->id, $_->title ] } @cds ], $expect_data,
75   'correct data in objects');
76 is_deeply($cache->get($rs->cursor->cache_key), $expect_data,
77   'correct data in cache');
78
79   $rs = $schema->resultset('CD')->search(undef, { cache_for => 300 });
80     # refresh resultset
81
82 $schema->storage->disconnect;
83
84   @cds = $rs->all; # uses cache, no SQL run
85
86 ok(!$schema->storage->connected, 'no reconnect made since no SQL required');
87 is_deeply([ map { [ $_->id, $_->title ] } @cds ], $expect_data,
88   'correct data in objects');
89 is_deeply($cache->get($rs->cursor->cache_key), $expect_data,
90   'correct data in cache');
91
92   $rs->cursor->clear_cache; # deletes data from cache
93
94 ok(!defined($cache->get($rs->cursor->cache_key)), 'cache cleared');
95
96   @cds = (); while (my $rec = $rs->next) { push(@cds, $rec); }
97
98 is_deeply([ map { [ $_->id, $_->title ] } @cds ], $expect_data,
99   'correct data in objects');
100 is_deeply($cache->get($rs->cursor->cache_key), $expect_data,
101   'correct data in cache');
102
103 }
104
105 {
106   my $schema = SchemaClass->connect(
107     sub {
108       DBI->connect('dbi:SQLite:t/var/test.db', '', '', { RaiseError => 1 }) },
109         { cursor_class => 'DBIx::Class::Cursor::Cached' }
110   );
111
112   $schema->default_resultset_attributes({
113     cache_object => Cache::FileCache->new({ namespace => 'SchemaClass' }),
114   });
115
116 my $cache = $schema->default_resultset_attributes->{cache_object};
117
118   my $rs = $schema->resultset('CD')->search(undef, { cache_for => 300 });
119
120   my @cds = $rs->all; # fills cache
121
122 is_deeply([ map { [ $_->id, $_->title ] } @cds ], $expect_data,
123   'correct data in objects');
124 is_deeply($cache->get($rs->cursor->cache_key), $expect_data,
125   'correct data in cache');
126
127   $rs = $schema->resultset('CD')->search(undef, { cache_for => 300 });
128     # refresh resultset
129
130 $schema->storage->disconnect;
131
132   @cds = $rs->all; # uses cache, no SQL run
133
134 ok(!$schema->storage->connected, 'no reconnect made since no SQL required');
135 is_deeply([ map { [ $_->id, $_->title ] } @cds ], $expect_data,
136   'correct data in objects');
137 is_deeply($cache->get($rs->cursor->cache_key), $expect_data,
138   'correct data in cache');
139
140   $rs->cursor->clear_cache; # deletes data from cache
141
142 ok(!defined($cache->get($rs->cursor->cache_key)), 'cache cleared');
143
144   @cds = (); while (my $rec = $rs->next) { push(@cds, $rec); }
145
146 is_deeply([ map { [ $_->id, $_->title ] } @cds ], $expect_data,
147   'correct data in objects');
148 is_deeply($cache->get($rs->cursor->cache_key), $expect_data,
149   'correct data in cache');
150 }
151
152