#!perl
# vim:ft=perl:

package MyObject;

# For testing purposes

use parent 'RT::Client::REST::Object';
use Params::Validate qw(:types);

sub rt_type { 'myobject' }

sub _attributes {
    {
        id  => {},
        abc => {
            validation => {
                type => SCALAR,
            },
        },
    }
}

sub retrieve {
    my $self = shift;
    $self->abc( $self->id );
    $self->{__dirty} = {};
    return $self;
}

my $i = 0;

sub store {
    my $self = shift;
    $::STORED = ++$i;
}

__PACKAGE__->_generate_methods;

package main;

use strict;
use warnings;

use vars qw($STORED);

use Test::More tests => 20;
use Test::Exception;

my $obj = MyObject->new( id => 1 );
ok( !defined( $obj->abc ), "retrieve has not been called" );

$obj->retrieve;
ok( defined( $obj->abc ), "retrieve has been called" );

$obj->abc(1);
ok( 1 == $obj->abc,               "attribute 'abc' set correctly" );
ok( 1 == $obj->_dirty,            "one dirty attribute" );
ok( 'abc' eq ( $obj->_dirty )[0], "and that attribute is 'abc'" );

ok( !defined( MyObject->autostore ), "autostore is disabled by default" );
ok( !defined( MyObject->autosync ),  "autosync is disabled by default" );
ok( !defined( MyObject->autoget ),   "autoget is disabled by default" );

throws_ok {
    MyObject->be_transparent(3);
}
'RT::Client::REST::Object::InvalidValueException';

use RT::Client::REST;
my $rt = RT::Client::REST->new;

lives_ok {
    MyObject->be_transparent($rt);
}
"made MyObject transparent";

ok( !defined( MyObject->autostore ), "autostore is still disabled" );
ok( MyObject->autosync,              "autosync is now enabled" );
ok( MyObject->autoget,               "autoget is now enabled" );
ok( $rt == MyObject->rt,             "the class keeps track of rt object" );

ok(
    !defined( RT::Client::REST::Object->autostore ),
    "autostore is disabled in the parent class"
);
ok(
    !defined( RT::Client::REST::Object->autosync ),
    "autosync is disabled in the parent class"
);
ok(
    !defined( RT::Client::REST::Object->autoget ),
    "autoget is disabled in the parent class"
);

$obj = MyObject->new( id => 4 );
ok( $obj->abc == 4, "object auto-retrieved" );
my $stored = $STORED;
$obj->abc(5);
ok( $stored + 1 == $STORED, "object is stored" );
$stored = $STORED;
$obj->id(10);
ok( $stored == $STORED, "modifying 'id' did not trigger a store" );