my
$schema
= DBICx::TestDatabase->new(
'AuditTest::Schema'
);
$schema
->audit_log_schema->deploy;
my
$al_schema
=
$schema
->audit_log_schema;
my
$test_user
;
$schema
->txn_do(
sub
{
$test_user
=
$schema
->resultset(
'User'
)->create(
{
name
=>
"JohnSample"
,
email
=>
'jsample@sample.com'
,
phone
=>
'999-888-7777'
,
}
);
},
{
description
=>
"adding new user: JohnSample"
,
user_id
=>
"TestAdminUser01"
,
},
);
my
$al_user
=
$al_schema
->resultset(
'AuditLogUser'
)
->search( {
name
=>
'TestAdminUser01'
} )->first;
isa_ok(
$al_user
->Changeset->first,
"DBIx::Class::Schema::AuditLog::Structure::Changeset"
,
"Changeset found after CREATE"
);
subtest
'CREATE Tests'
=>
sub
{
ok(
$al_user
->Changeset->first->description eq
"adding new user: JohnSample"
,
"AuditLogChangeset has correct description"
);
ok(
$al_user
->Changeset->first->Action->first->action_type eq
"insert"
,
"AuditLogAction has correct type"
);
ok(
$al_user
->Changeset->first->Action->first->Change,
"AuditLogChange(s) found for CREATE"
);
ok( !
$al_schema
->resultset(
'AuditLogField'
)->search( {
name
=>
"email"
} )
->count,
"Field 'email' correctly ignored as per schema option"
);
done_testing();
};
$schema
->txn_do(
sub
{
$test_user
=
$schema
->resultset(
'User'
)->find( {
name
=>
"JohnSample"
} )
->update( {
name
=>
'JaneSample'
, } );
},
{
description
=>
"updating user: JohnSample"
,
user_id
=>
"TestAdminUser02"
,
},
);
$al_user
=
$al_schema
->resultset(
'AuditLogUser'
)
->search( {
name
=>
'TestAdminUser02'
} )->first;
isa_ok(
$al_user
->Changeset->first,
"DBIx::Class::Schema::AuditLog::Structure::Changeset"
,
"Changeset found after UPDATE"
);
subtest
'UPDATE Tests'
=>
sub
{
ok(
$al_user
->Changeset->first->description eq
"updating user: JohnSample"
,
"AuditLogChangeset has correct description"
);
ok(
$al_user
->Changeset->first->Action->first->action_type eq
"update"
,
"AuditLogAction has correct type"
);
ok(
$al_user
->Changeset->first->Action->first->Change->first->old_value eq
'JohnSample'
,
"AuditLogChange OLD value correct"
);
ok(
$al_user
->Changeset->first->Action->first->Change->first->new_value eq
'JaneSample'
,
"AuditLogChange NEW value correct"
);
done_testing();
};
$schema
->txn_do(
sub
{
$test_user
=
$schema
->resultset(
'User'
)->find( {
name
=>
"JaneSample"
} )
->
delete
;
},
{
description
=>
"deleting user: JaneSample"
,
user_id
=>
"TestAdminUser03"
,
},
);
$al_user
=
$al_schema
->resultset(
'AuditLogUser'
)
->search( {
name
=>
'TestAdminUser03'
} )->first;
isa_ok(
$al_user
->Changeset->first,
"DBIx::Class::Schema::AuditLog::Structure::Changeset"
,
"Changeset found after DELETE"
);
subtest
'DELETE Tests'
=>
sub
{
ok(
$al_user
->Changeset->first->description eq
"deleting user: JaneSample"
,
"AuditLogChangeset has correct description"
);
ok(
$al_user
->Changeset->first->Action->first->action_type eq
"delete"
,
"AuditLogAction has correct type"
);
my
$field
=
$al_schema
->resultset(
'AuditLogField'
)
->search( {
name
=>
'name'
} )->first;
ok(
$al_user
->Changeset->first->Action->first->Change->search(
{
field_id
=>
$field
->id }
)->first->old_value eq
'JaneSample'
,
"AuditLogChange OLD value correct"
);
ok( !
defined
$al_user
->Changeset->first->Action->first->Change->first
->new_value,
"AuditLogChange NEW value correctly set to null"
);
done_testing();
};
{
no
warnings
'once'
;
local
$DBIx::Class::AuditLog::enabled
= 0;
$schema
->txn_do(
sub
{
$test_user
=
$schema
->resultset(
'User'
)->create(
{
name
=>
"Larry Wall"
,
email
=>
'lwall@perl.org'
,
phone
=>
'123-457-7890'
,
}
);
},
{
description
=>
"adding new user: Lary Wall"
,
user_id
=>
"TestAdminUser04"
,
},
);
$al_user
=
$al_schema
->resultset(
'AuditLogUser'
)
->search( {
name
=>
'TestAdminUser04'
} )->first;
ok(!
$al_user
,
'No audit log created when $DBIx::Class::AuditLog::enabled = 0'
);
}
$schema
->txn_do(
sub
{
$test_user
->name(
'Damian Conway'
);
$test_user
->update;
{
no
warnings
'once'
;
local
$DBIx::Class::AuditLog::enabled
= 0;
$test_user
->email(
'dconway@perl.org'
);
$test_user
->update;
}
},
{
description
=>
"updating user: Lary Wall -> name = Damian Conway"
,
user_id
=>
"TestAdminUser05"
,
},
);
$al_user
=
$al_schema
->resultset(
'AuditLogUser'
)
->search( {
name
=>
'TestAdminUser05'
} )->first;
ok(
$al_user
->Changeset->first->Action->first->Change->first->new_value eq
'Damian Conway'
,
"Audit Logging again enabled outside of scoped local enabled = 0"
);
ok(
$al_user
->Changeset->first->Action->count == 1,
'Locally scoped enabled = 0 inside transaction is not logged'
);
done_testing();