1use strict;
2use warnings;
3use utf8;
4use Test::More;
5use SQL::Maker;
6use SQL::QueryMaker;
7
8sub checkerr {
9    my $code = shift;
10    return sub {
11        local $@;
12        my $query = eval {
13            $code->();
14        };
15        ok ! defined $query, "does not return anything";
16        like $@, qr/cannot pass in an unblessed ref/, "error is thrown";
17    };
18}
19
20my $maker = SQL::Maker->new(
21    driver => 'SQLite',
22    strict => 1,
23);
24
25ok $maker->strict, "maker->strict";
26
27subtest "maker->select where" => sub {
28  my ($sql, @binds) = $maker->select("table", ["*"], sql_eq(id => 1));
29  like $sql, qr/WHERE\s+.*id.*\s*=/s;
30  is_deeply \@binds, [ 1 ];
31};
32
33subtest "maker->update where" => sub {
34  my ($sql, @binds) = $maker->update("table", [], sql_eq(id => 1));
35  like $sql, qr/WHERE\s+.*id.*\s*=/s;
36  is_deeply \@binds, [ 1 ];
37};
38
39subtest "maker->delete where" => sub {
40  my ($sql, @binds) = $maker->delete("table", sql_eq(id => 1));
41  like $sql, qr/WHERE\s+.*id.*\s*=/s;
42  is_deeply \@binds, [ 1 ];
43};
44
45subtest "maker->where" => sub {
46  my ($sql, @binds) = $maker->where(sql_eq(id => 1));
47  like $sql, qr/id.*\s*=/s;
48  is_deeply \@binds, [ 1 ];
49};
50
51subtest "maker->new_condition (err)" => checkerr(sub {
52    $maker->new_condition->add(
53        foo => [1],
54    );
55});
56
57{
58    my $select = $maker->new_select;
59    ok $select->strict, "select->strict";
60    subtest "select->new_condition (err)" => checkerr(sub {
61        $select->new_condition->add(
62            foo => [1],
63        );
64    });
65}
66
67subtest "maker->select (err)" => checkerr(sub {
68    $maker->select("user", ['*'], { name => ["John", "Tom" ]});
69});
70
71subtest "maker->select (ok)", sub {
72    $maker->select("user", ['*'], { name => sql_in(["John", "Tom"]) });
73    $maker->select("user", ['*'], $maker->new_condition->add(name => sql_in(["John", "Tom"])));
74    $maker->select("user", ['*'], sql_in(name => ["John", "Tom"]));
75    ok("run without croaking");
76};
77
78subtest "maker->insert (err)" => checkerr(sub {
79    $maker->insert(
80        user => [ name => "John", created_on => \"datetime(now)" ]
81    );
82});
83
84subtest "maker->insert (ok)" => sub {
85    $maker->insert(user => [name => "John", created_on => sql_raw("datetime(now)")]);
86    ok("run without croaking");
87};
88
89subtest "maker->delete (err)" => checkerr(sub {
90    $maker->delete(user => [ name => ["John", "Tom"]]);
91});
92
93subtest "maker->update where (err)" => checkerr(sub {
94    $maker->update(user => [name => "John"], { user_id => [1, 2] });
95});
96
97subtest "maker->update set (err)" => checkerr(sub {
98    $maker->update(user => [name => \"select *"]);
99});
100
101done_testing;
102