my
$schema
= DBICx::TestDatabase->new(
'AuditTestRel::Schema'
);
isa_ok(
$schema
,
'DBIx::Class::Schema::AuditLog'
);
$schema
->populate(
'Person'
,[
[
'id'
,
'name'
],
[ 1,
'Fooman'
],
[ 2,
'Barwoman'
],
]);
$schema
->populate(
'Title'
,[
[
'id'
,
'name'
],
[ 1,
'CommonTitle'
],
[ 2,
'SpecialTitle'
],
]);
$schema
->populate(
'Book'
,[
[
'id'
,
'title_id'
,
'isbn'
],
[ 1, 1,
'12345'
],
[ 2, 2,
'54321'
],
[ 3, 2,
'11223'
],
]);
$schema
->populate(
'BookAuthor'
,[
[
'book_id'
,
'author_id'
],
[ 1, 1,],
[ 2, 1,],
[ 3, 2,],
[ 3, 1,],
]);
$schema
->audit_log_schema->deploy;
my
$al_schema
=
$schema
->audit_log_schema;
my
$changesets
=
$al_schema
->resultset(
'AuditLogChangeset'
);
my
$title1
=
$schema
->resultset(
'Title'
)->find( {
name
=>
'CommonTitle'
} );
my
$title2
=
$schema
->resultset(
'Title'
)->find( {
name
=>
'SpecialTitle'
} );
my
$book1
=
$schema
->resultset(
'Book'
)->find(1);
$schema
->txn_do(
sub
{
$book1
->update_from_related(
'title'
,
$title2
);
},
{}
);
subtest
'validate changeset after update_from_related'
=>
sub
{
is(
$changesets
->count, 1,
"one changeset after set_from_related"
);
is(
$changesets
->first->Action->count, 1,
"one action in changeset after set_from_related"
);
my
$action
=
$changesets
->first->Action->first;
is(
$action
->AuditedTable->name,
'book'
,
'Book-table audited'
);
is(
$action
->Change->count, 1,
'one change logged'
);
my
$change
=
$action
->Change->first;
is(
$change
->Field->name,
'title_id'
,
'title_id field logged'
);
is(
$change
->old_value, 1,
'old value logged correctly'
);
is(
$change
->new_value, 2,
'new value logged correctly'
);
};
$schema
->txn_do(
sub
{
$title1
->create_related(
'books'
, {
isbn
=>
'12321'
, } );
}
);
subtest
'validate changeset after create_related'
=>
sub
{
is(
$changesets
->count, 2,
"two changesets after create_related"
);
is(
$changesets
->find(2)->Action->count, 1,
"one action in changeset after create_related"
);
my
$action
=
$changesets
->find(2)->Action->first;
is(
$action
->AuditedTable->name,
'book'
,
'Book-table audited'
);
my
$changes
=
$action
->Change;
is(
$changes
->count, 3,
'three changes logged'
);
my
$id_field
=
$al_schema
->resultset(
'AuditLogField'
)->find({
name
=>
'id'
,
audited_table_id
=> 1});
isa_ok(
$id_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
my
$id_change
=
$changes
->find({
field_id
=>
$id_field
->id});
isa_ok(
$id_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$id_change
->old_value,
'id field has no old value'
);
my
$isbn_field
=
$al_schema
->resultset(
'AuditLogField'
)->find({
name
=>
'isbn'
,
audited_table_id
=> 1});
isa_ok(
$isbn_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
my
$isbn_change
=
$changes
->find({
field_id
=>
$isbn_field
->id});
isa_ok(
$isbn_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$isbn_change
->old_value,
'isbn field has no old value'
);
my
$title_id_field
=
$al_schema
->resultset(
'AuditLogField'
)->find({
name
=>
'title_id'
,
audited_table_id
=> 1});
isa_ok(
$title_id_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
my
$title_id_change
=
$changes
->find({
field_id
=>
$title_id_field
->id});
isa_ok(
$title_id_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$title_id_change
->old_value,
'title_id field has no old value'
);
is(
$title_id_change
->new_value,
$title1
->id,
'new value for title_id is set correctly'
);
};
my
$new_book
=
$schema
->resultset(
'Book'
)->find( {
isbn
=>
'12321'
} );
$schema
->txn_do(
sub
{
$new_book
->add_to_authors(
$schema
->resultset(
'Person'
)->find(1) );
}
);
subtest
'validate changeset after add_to_$rel'
=>
sub
{
is(
$changesets
->count, 3,
"three changesets after add_to_rel"
);
is(
$changesets
->find(3)->Action->count, 1,
"one action in changeset after add_to_rel"
);
my
$action
=
$changesets
->find(3)->Action->first;
is(
$action
->AuditedTable->name,
'bookauthor'
,
'BookAuthor-table audited'
);
my
$changes
=
$action
->Change;
is(
$changes
->count, 2,
'two changes logged'
);
my
$bookauthor_table
=
$al_schema
->resultset(
'AuditLogAuditedTable'
)->find({
name
=>
'bookauthor'
});
my
$author_id_field
=
$al_schema
->resultset(
'AuditLogField'
)->find({
name
=>
'author_id'
,
audited_table_id
=>
$bookauthor_table
->id});
isa_ok(
$author_id_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
my
$author_id_change
=
$changes
->find({
field_id
=>
$author_id_field
->id});
isa_ok(
$author_id_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$author_id_change
->old_value,
'author_id field has no old value'
);
is(
$author_id_change
->new_value, 1,
'author_id field has correct new value'
);
my
$book_id_field
=
$al_schema
->resultset(
'AuditLogField'
)->find({
name
=>
'book_id'
,
audited_table_id
=>
$bookauthor_table
->id});
isa_ok(
$book_id_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
my
$book_id_change
=
$changes
->find({
field_id
=>
$book_id_field
->id});
isa_ok(
$book_id_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$book_id_change
->old_value,
'book_id field has no old value'
);
is(
$book_id_change
->new_value,
$new_book
->id,
'book_id field has correct new value'
);
};
$schema
->txn_do(
sub
{
$new_book
->set_authors(
[
$schema
->resultset(
'Person'
)->find(2),
$schema
->resultset(
'Person'
)->find(1)
]
);
}
);
subtest
'validate changeset after set_$rel'
=>
sub
{
is(
$changesets
->count, 4,
"three changesets after set_rel"
);
is(
$changesets
->find(4)->Action->count, 3,
"three actions in changeset after set_rel"
);
my
$bookauthor_table
=
$al_schema
->resultset(
'AuditLogAuditedTable'
)->find({
name
=>
'bookauthor'
});
my
$author_id_field
=
$al_schema
->resultset(
'AuditLogField'
)->find({
name
=>
'author_id'
,
audited_table_id
=>
$bookauthor_table
->id});
my
$book_id_field
=
$al_schema
->resultset(
'AuditLogField'
)->find({
name
=>
'book_id'
,
audited_table_id
=>
$bookauthor_table
->id});
my
$actions
=
$changesets
->find(4)->Action;
my
$action
=
$actions
->
next
;
is(
$action
->AuditedTable->name,
'bookauthor'
,
'BookAuthor-table audited'
);
is(
$action
->action_type,
'delete'
,
'first action is "delete"'
);
my
$changes
=
$action
->Change;
is(
$changes
->count, 2,
'two changes logged'
);
isa_ok(
$author_id_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
my
$author_id_change
=
$changes
->find({
field_id
=>
$author_id_field
->id});
isa_ok(
$author_id_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$author_id_change
->new_value,
'author_id field has no new value in "delete"'
);
is(
$author_id_change
->old_value, 1,
'author_id field has correct old value in "delete"'
);
isa_ok(
$book_id_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
my
$book_id_change
=
$changes
->find({
field_id
=>
$book_id_field
->id});
isa_ok(
$book_id_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$book_id_change
->new_value,
'book_id field has no new value in "delete"'
);
is(
$book_id_change
->old_value, 4,
'book_id field has correct old value in "delete"'
);
$action
=
$actions
->
next
;
is(
$action
->AuditedTable->name,
'bookauthor'
,
'BookAuthor-table audited'
);
is(
$action
->action_type,
'insert'
,
'second action is "insert"'
);
$changes
=
$action
->Change;
is(
$changes
->count, 2,
'two changes logged'
);
isa_ok(
$author_id_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
$author_id_change
=
$changes
->find({
field_id
=>
$author_id_field
->id});
isa_ok(
$author_id_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$author_id_change
->old_value,
'author_id field has no old value in "insert"'
);
is(
$author_id_change
->new_value, 2,
'author_id field has correct new value in "insert"'
);
isa_ok(
$book_id_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
$book_id_change
=
$changes
->find({
field_id
=>
$book_id_field
->id});
isa_ok(
$book_id_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$book_id_change
->old_value,
'book_id field has no old value in "insert"'
);
is(
$book_id_change
->new_value,
$new_book
->id,
'book_id field has correct new value in "insert"'
);
$action
=
$actions
->
next
;
is(
$action
->AuditedTable->name,
'bookauthor'
,
'BookAuthor-table audited'
);
is(
$action
->action_type,
'insert'
,
'second action is "insert"'
);
$changes
=
$action
->Change;
is(
$changes
->count, 2,
'two changes logged'
);
isa_ok(
$author_id_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
$author_id_change
=
$changes
->find({
field_id
=>
$author_id_field
->id});
isa_ok(
$author_id_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$author_id_change
->old_value,
'author_id field has no old value in "insert"'
);
is(
$author_id_change
->new_value, 1,
'author_id field has correct new value in "insert"'
);
isa_ok(
$book_id_field
,
'DBIx::Class::Schema::AuditLog::Structure::Field'
);
$book_id_change
=
$changes
->find({
field_id
=>
$book_id_field
->id});
isa_ok(
$book_id_change
,
'DBIx::Class::Schema::AuditLog::Structure::Change'
);
ok(!
$book_id_change
->old_value,
'book_id field has no old value in "insert"'
);
is(
$book_id_change
->new_value,
$new_book
->id,
'book_id field has correct new value in "insert"'
);
};