| | 288 | sub fixable : Tests(12) { |
|---|
| | 289 | my $self = shift; |
|---|
| | 290 | |
|---|
| | 291 | my $driver = MT::Object->dbi_driver; |
|---|
| | 292 | my $dbh = $driver->rw_handle; |
|---|
| | 293 | my $ddl_class = $driver->dbd->ddl_class; |
|---|
| | 294 | |
|---|
| | 295 | eval { |
|---|
| | 296 | if ($driver->table_exists('Ddltest::Fixable')) { |
|---|
| | 297 | my $sql = $driver->dbd->ddl_class->drop_table_sql('Ddltest::Fixable'); |
|---|
| | 298 | $driver->rw_handle->do($sql); |
|---|
| | 299 | } |
|---|
| | 300 | }; |
|---|
| | 301 | eval { |
|---|
| | 302 | my $sql = $ddl_class->create_table_sql('Ddltest::Fixable'); |
|---|
| | 303 | $dbh->do($sql); |
|---|
| | 304 | }; |
|---|
| | 305 | for my $i (1..5) { |
|---|
| | 306 | my $obj = Ddltest::Fixable->new; |
|---|
| | 307 | $obj->foo($i); |
|---|
| | 308 | $obj->save; |
|---|
| | 309 | } |
|---|
| | 310 | |
|---|
| | 311 | my $defs = $ddl_class->column_defs('Ddltest::Fixable'); |
|---|
| | 312 | ok($defs->{baz}, 'Ddltest::Fixable table has baz column after creation'); |
|---|
| | 313 | |
|---|
| | 314 | my $sql = $ddl_class->drop_column_sql('Ddltest::Fixable', 'baz'); |
|---|
| | 315 | ok($sql, 'Ddltest::Fixable can have column dropping sql'); |
|---|
| | 316 | my $res = $dbh->do($sql); |
|---|
| | 317 | ok($res, 'Ddltest::Fixable could have its column dropped'); |
|---|
| | 318 | |
|---|
| | 319 | { |
|---|
| | 320 | local Ddltest::Fixable->properties->{column_defs}->{borf} = 'string(10)'; |
|---|
| | 321 | $sql = $ddl_class->add_column_sql('Ddltest::Fixable', 'borf'); |
|---|
| | 322 | ok($sql, 'Ddltest::Fixable can have column adding sql'); |
|---|
| | 323 | $res = $dbh->do($sql); |
|---|
| | 324 | ok($res, 'Ddltest::Fixable could have a column added'); |
|---|
| | 325 | diag(($dbh->errstr || $DBI::errstr) . "( sql $sql)") if !$res; |
|---|
| | 326 | } |
|---|
| | 327 | |
|---|
| | 328 | $defs = $ddl_class->column_defs('Ddltest::Fixable'); |
|---|
| | 329 | ok(!$defs->{baz}, 'Ddltest::Fixable did indeed have a column dropped'); |
|---|
| | 330 | ok( $defs->{borf}, 'Ddltest::Fixable did indeed have a column added'); |
|---|
| | 331 | |
|---|
| | 332 | STMT: for my $stmt ($ddl_class->fix_class('Ddltest::Fixable')) { |
|---|
| | 333 | $res = $dbh->do($stmt); |
|---|
| | 334 | if (!$res) { |
|---|
| | 335 | diag($dbh->errstr || $DBI::errstr); |
|---|
| | 336 | last STMT; |
|---|
| | 337 | } |
|---|
| | 338 | } |
|---|
| | 339 | ok($res, q{All Ddltest::Fixable's table-fixing statements were performed}); |
|---|
| | 340 | $defs = $ddl_class->column_defs('Ddltest::Fixable'); |
|---|
| | 341 | ok( $defs->{baz}, 'Ddltest::Fixable regrew its dropped column after a fix_class'); |
|---|
| | 342 | ok(!$defs->{borf}, 'Ddltest::Fixable lost its extra column after a fix_class'); |
|---|
| | 343 | |
|---|
| | 344 | my @objs = Ddltest::Fixable->load(); |
|---|
| | 345 | is(scalar @objs, 5, 'There are still 5 Ddltest::Fixable records'); |
|---|
| | 346 | is_deeply([ sort map { $_->foo } @objs ], [ 1..5 ], 'Ddltest::Fixable records survived with values intact'); |
|---|
| | 347 | } |
|---|
| | 348 | |
|---|