The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use warnings;
use strict;

use Jifty::Test::Dist tests => 55;

my $user = TestApp::Plugin::RecordHistory::Model::User->new;
$user->create(
    name => 'tester',
);
ok($user->id, 'created user');

my $current_user = TestApp::Plugin::RecordHistory::CurrentUser->new(id => $user->id);

my $ticket = TestApp::Plugin::RecordHistory::Model::Ticket->new(current_user => $current_user);
$ticket->create(
    subject => 'Hello world',
);
ok($ticket->id, 'created a ticket');

isa_ok($ticket->changes, 'Jifty::Plugin::RecordHistory::Model::ChangeCollection');
is($ticket->changes->count, 1, 'one change');
my $change = $ticket->changes->first;
is($change->record_id, $ticket->id, 'record id');
is($change->record_class, 'TestApp::Plugin::RecordHistory::Model::Ticket', 'record class');
is($change->type, 'create', 'change has type create');
is($change->record->subject, 'Hello world', 'change->record');
is($change->created_by->id, $user->id, 'correct creator');

is($change->current_user->id, $user->id, 'current user is the user not superuser');
ok(!$change->current_user->is_superuser, 'not superuser');

$ticket->set_subject('Konnichiwa sekai');

isa_ok($ticket->changes, 'Jifty::Plugin::RecordHistory::Model::ChangeCollection');
is($ticket->changes->count, 2, 'two changes');
is($ticket->changes->first->type, 'create', 'first change is the create');
$change = $ticket->changes->last;
is($change->type, 'update', 'second change is the update');
is($change->change_fields->count, 1, 'one field updated');
is($change->created_by->id, $user->id, 'correct creator');

is($change->current_user->id, $user->id, 'current user is the user not superuser');
ok(!$change->current_user->is_superuser, 'not superuser');

my $change_field = $change->change_fields->first;
is($change_field->change->id, $change->id, 'associated with the right change');
is($change_field->field, 'subject');
is($change_field->new_value, 'Konnichiwa sekai');
is($change_field->old_value, 'Hello world');

is($change_field->current_user->id, $user->id, 'current user is the user not superuser');
ok(!$change_field->current_user->is_superuser, 'not superuser');

$ticket->set_forced_updatable(0);

isa_ok($ticket->changes, 'Jifty::Plugin::RecordHistory::Model::ChangeCollection');
is($ticket->changes->count, 3, 'three changes');
$change = $ticket->changes->last;
is($change->type, 'update', 'last change is the update');
is($change->change_fields->count, 1, 'one field updated');
is($change->created_by->id, $user->id, 'correct creator');

is($change->current_user->id, $user->id, 'current user is the user not superuser');
ok(!$change->current_user->is_superuser, 'not superuser');

my $change_field = $change->change_fields->first;
is($change_field->change->id, $change->id, 'associated with the right change');
is($change_field->field, 'forced_updatable');
is($change_field->new_value, 0);
is($change_field->old_value, 1);

is($change_field->current_user->id, $user->id, 'current user is the user not superuser');
ok(!$change_field->current_user->is_superuser, 'not superuser');

# make sure we don't create spurious changes when a record couldn't be updated
$ticket->set_forced_updatable(1);
is($ticket->forced_updatable, 0, "ticket was not updated");
is($ticket->changes->count, 3, "still only three changes since we couldn't update the record");

$change = Jifty::Plugin::RecordHistory::Model::Change->new(current_user => $current_user);
$change->create(
    record_class => ref($ticket),
    record_id    => $ticket->id,
    type         => 'forged',
);
ok(!$change->id, "couldn't create a change as an ordinary user");

my $super_ticket = TestApp::Plugin::RecordHistory::Model::Ticket->new(current_user => Jifty::CurrentUser->superuser);
$super_ticket->load($ticket->id);
$super_ticket->set_forced_updatable(1);

# flush cache
$ticket->load($ticket->id);

is($ticket->forced_updatable, 1, "ticket was updated");
is($ticket->changes->count, 4, "now four changes since the superuser *could* update the record");

$ticket->set_forced_readable(0);
ok(!$ticket->current_user_can('read'), "can no longer read the ticket");
is($ticket->subject, undef, "can no longer read ticket fields");
isa_ok($ticket->changes, 'Jifty::Plugin::RecordHistory::Model::ChangeCollection');
is($ticket->changes->current_user->id, $user->id, 'current user is the user not superuser');
ok(!$ticket->changes->current_user->is_superuser, 'not superuser');
is($ticket->changes->first, undef, "no readable changes");

$super_ticket->load($ticket->id);
$super_ticket->set_forced_readable(1);

# flush cache
$ticket->load($ticket->id);

is($ticket->forced_readable, 1, "ticket was updated");
is($ticket->changes->count, 6, "all the changes");

$ticket->set_forced_deletable(0);
$ticket->delete;
$ticket->load($super_ticket->id);
ok($ticket->id, 'still have a record');

is($ticket->changes->count, 7, "a new change from updating the record, but we couldn't ");

$ticket->set_forced_deletable(1);
$ticket->delete;
$ticket->load($super_ticket->id);
ok(!$ticket->id, 'still have a record');

is($ticket->changes->count, 0, "all changes gone now");