add a basic -dt_add op and experiment with it
[dbsrgits/DBIx-Class.git] / t / sqlmaker / op_dt.t
1 use strict;
2 use warnings;
3
4 use Test::More;
5 use Test::Fatal;
6
7 use lib qw(t/lib);
8 use DBIC::SqlMakerTest;
9 use DateTime;
10
11 use_ok('DBICTest');
12
13 my $schema = DBICTest->init_schema();
14
15 my $sql_maker = $schema->storage->sql_maker;
16
17 my $date = DateTime->new(
18    year => 2010,
19    month => 12,
20    day   => 14,
21    hour  => 12,
22    minute => 12,
23    second => 12,
24 );
25
26 my $date2 = $date->clone->set_day(16);
27
28 use Devel::Dwarn;
29
30 Dwarn [$schema->resultset('Artist')->search(undef, {
31    select => [
32       [ -dt_diff => [second => { -dt => $date }, { -dt => $date2 }] ],
33       [ -dt_diff => [day    => { -dt => $date }, { -dt => $date2 }] ],
34       [ -dt_add => [minute => 3, { -dt => $date }] ],
35       [ -dt_add => [minute => 3, { -dt_add => [ hour => 1, { -dt => $date } ] } ] ],
36       [ -dt_now => [] ],
37       [ -dt_now => ['system'] ],
38    ],
39    as => [qw(seconds days date date2 now now_local)],
40    result_class => 'DBIx::Class::ResultClass::HashRefInflator',
41    rows => 1,
42 })->all];
43
44 is_same_sql_bind (
45   \[ $sql_maker->select ('artist', '*', { 'artist.when_began' => { -dt => $date } } ) ],
46   "SELECT *
47     FROM artist
48     WHERE artist.when_began = ?
49   ",
50   [['artist.when_began', '2010-12-14 12:12:12']],
51   '-dt works'
52 );
53
54 is_same_sql_bind (
55   \[ $sql_maker->update ('artist',
56     { 'artist.when_began' => { -dt => $date } },
57     { 'artist.when_ended' => { '<' => { -dt => $date2 } } },
58   ) ],
59   "UPDATE artist
60     SET artist.when_began = ?
61     WHERE artist.when_ended < ?
62   ",
63   [
64    ['artist.when_began', '2010-12-14 12:12:12'],
65    ['artist.when_ended', '2010-12-16 12:12:12'],
66   ],
67   '-dt works'
68 );
69
70 is_same_sql_bind (
71   \[ $sql_maker->select ('artist', '*', {
72     -and => [
73        { -op => [ '=', 12, { -dt_month => { -ident => 'artist.when_began' } } ] },
74        { -op => [ '=', 2010, { -dt_get => [year => \'artist.when_began'] } ] },
75        { -op => [ '=', 14, { -dt_get => [day_of_month => \'artist.when_began'] } ] },
76        { -op => [ '=', 100, { -dt_diff => [second => { -ident => 'artist.when_began' }, \'artist.when_ended'] } ] },
77        { -op => [ '=', 10, { -dt_diff => [day => { -ident => 'artist.when_played_last' }, \'artist.when_ended'] } ] },
78     ]
79   } ) ],
80   "SELECT *
81      FROM artist
82      WHERE ( (
83        ( ? = STRFTIME('%m', artist.when_began) ) AND
84        ( ? = STRFTIME('%Y', artist.when_began) ) AND
85        ( ? = STRFTIME('%d', artist.when_began) ) AND
86        ( ? = ( STRFTIME('%s', artist.when_began) - STRFTIME('%s', artist.when_ended))) AND
87        ( ? = ( JULIANDAY(artist.when_played_last) - JULIANDAY(artist.when_ended)))
88      ) )
89   ",
90   [
91    ['', 12],
92    ['', 2010],
93    ['', 14],
94    ['', 100],
95    ['', 10],
96   ],
97   '-dt_month, -dt_get, and -dt_diff work'
98 );
99
100 like exception { $sql_maker->select('foo', '*', { -dt_diff => [year => \'artist.lololol', \'artist.fail'] }) }, qr/date diff not supported for part "year" with database "SQLite"/, 'SQLite does not support year diff';
101
102 done_testing;