The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
BEGIN
{
    my @args;
    if (grep { ! exists $ENV{$_} }
        map { "MYSQL_${_}" } qw(DSN USER PASSWORD))
    {
        push @args, (skip_all => "Need to define MYSQL_DSN MYSQL_USER MYSQL_PASSWORD");
    } else {
        @args = (tests => 11);
    }

    require Test::More;
    Test::More->import(@args);
}

package PluginTest::MySQL;
use strict;
use base qw(Class::DBI);
use Class::DBI::Plugin::DateTime 'MySQL';

my $table    = "cdbi_plugin_dt_mysql";
my $dsn      = 'dbi:mysql:' . $ENV{MYSQL_DSN};
my $user     = $ENV{MYSQL_USER};
my $password = $ENV{MYSQL_PASSWORD};

PluginTest::MySQL->set_db(Main => ($dsn, $user, $password));
PluginTest::MySQL->db_Main->do(qq{
    CREATE TABLE $table (
        id INTEGER,
        a_datetime  DATETIME,
        a_date      DATE,
        a_timestamp TIMESTAMP,
        PRIMARY KEY(id)
    )
});

PluginTest::MySQL->table($table);
PluginTest::MySQL->columns(All => qw(id a_timestamp a_date a_datetime));
PluginTest::MySQL->has_timestamp('a_timestamp');
PluginTest::MySQL->has_datetime('a_datetime');
PluginTest::MySQL->has_date('a_date');

package main;
use strict;

eval {
    my $dt  = DateTime->now;
    my $obj = PluginTest::MySQL->create({
        id => 1,
        a_timestamp => $dt,
        a_datetime  => $dt,
        a_date      => $dt
    });
    ok($obj, "Object creation");
    is($obj->a_timestamp, $dt, "Timestamp match");
    is($obj->a_date, $dt->clone->truncate(to => 'day'), "date match");
    is($obj->a_datetime, $dt, "Datetime match");

    my $dt2 = DateTime->new(year => 2005, month => 7, day => 13, hour => 7, minute => 13, second => 20);
    ok($obj->a_timestamp($dt2));
    ok($obj->a_datetime($dt2));
    ok($obj->a_date($dt2));
    ok($obj->update);
    is($obj->a_timestamp, $dt2, "Timestamp match");
    is($obj->a_date, $dt2->clone->truncate(to => 'day'), "date match");
    is($obj->a_datetime, $dt2, "Datetime match");
};
die if $@;

PluginTest::MySQL->db_Main->do("DROP TABLE $table");