diff --git a/t/lib/Test/Collection.pm b/t/lib/Test/Collection.pm index 2a69ce8f48..73687ccc2b 100644 --- a/t/lib/Test/Collection.pm +++ b/t/lib/Test/Collection.pm @@ -17,7 +17,20 @@ use File::Basename; use Test::HTTPRequestAsCurl; use Data::Dumper; use File::Slurp qw/write_file/; +use Storable; +has 'data_cache_file' => ( + is => 'ro', + isa => 'Str', + lazy => 1, + default => sub {'/tmp/ngcp-api-test-data-cache';}, +); +has 'cache_data' => ( + is => 'ro', + isa => 'Bool', + lazy => 1, + default => $ENV{API_CACHE_FAKE_DATA} // 0, +); has 'local_test' => ( is => 'rw', isa => 'Str', @@ -501,6 +514,21 @@ sub request_delete{ my $req = HTTP::Request->new('DELETE', $self->normalize_uri($uri)); my $res = $self->request($req); my $content = $self->get_response_content($res); + if($self->cache_data){ + #my $restored = (-e $self->data_cache_file) ? retrieve($self->data_cache_file) : {}; + #if('204' eq $res->code){ + # $restored->{deleted}->{204}->{$uri} = 1; + #} + #$restored->{deleted}->{all}->{$uri} = [$res->code,$res->message]; + #store $restored, $self->data_cache_file; + $self->replace_cached_data(sub{ + my $restored = shift; + if('204' eq $res->code){ + $restored->{deleted}->{204}->{$uri} = 1; + } + $restored->{deleted}->{all}->{$uri} = [$res->code,$res->message]; + }); + } return($req,$res,$content); } @@ -904,6 +932,7 @@ sub clear_test_data_all{ $self->http_code_msg(204, "check delete item $del_uri",$res,$content); } $self->clear_data_created(); + return \@uris; } sub clear_test_data_dependent{ my($self,$uri) = @_; @@ -1045,4 +1074,28 @@ sub http_code_msg{ } $code and is($res->code, $code, $message_res); } +sub get_cached_data{ + my($self) = @_; + return (-e $self->data_cache_file) ? retrieve($self->data_cache_file) : {}; +} + +sub replace_cached_data{ + my($self,$data_callback,$restored) = @_; + $restored //= $self->get_cached_data; + $data_callback->($restored); + store $restored,$self->data_cache_file; + return $restored; +} +sub get_cached_data{ + my($self) = @_; + return (-e $self->data_cache_file) ? retrieve($self->data_cache_file) : {}; +} + +sub replace_cached_data{ + my($self,$data_callback,$restored) = @_; + $restored //= $self->get_cached_data; + $data_callback->($restored); + store $restored,$self->data_cache_file; + return $restored; +} 1; diff --git a/t/lib/Test/FakeData.pm b/t/lib/Test/FakeData.pm index 15b9bcf563..a36cd2bb81 100644 --- a/t/lib/Test/FakeData.pm +++ b/t/lib/Test/FakeData.pm @@ -12,7 +12,22 @@ use Test::DeepHashUtils qw(reach nest deepvalue); use Clone qw/clone/; use File::Slurp qw/read_file/; use URI::Escape; +use Storable; +sub BUILD { + my $self = shift; + if($self->test_machine->cache_data){ + $self->read_cached_data(); + } +} +has 'data_cache_file' => ( + is => 'ro', + isa => 'Str', + lazy => 1, + default => sub { + return shift->test_machine->data_cache_file; + }, +); has 'test_machine' =>( is => 'rw', isa => 'Test::Collection', @@ -570,6 +585,30 @@ sub create{ } return $self->get_existent_id($collection_name); } +sub read_cached_data{ + my $self = shift; + if(! -e $self->data_cache_file ){ + return; + } + my $restored = retrieve($self->data_cache_file); + my $clear_cached_from_deleted = sub { + my $cached_collections = shift; + foreach my $cached_collection(keys %{$cached_collections}){ + foreach my $deleted_uri(keys %{$restored->{deleted}->{204}}){ + if(index($cached_collections->{$cached_collection}->{location},$deleted_uri) || index($deleted_uri,$cached_collections->{$cached_collection}->{location})){ + delete $cached_collections->{$cached_collection}; + } + } + } + }; + $clear_cached_from_deleted->($restored->{loaded}); + $clear_cached_from_deleted->($restored->{created}); + $self->loaded($restored->{loaded} // {} ); + $self->created($restored->{created} // {} ); + #delete $restored->{deleted}; + store {loaded => $self->loaded, created => $self->created}, $self->data_cache_file; +} + sub DEMOLISH{ my($self) = @_; ( 'ARRAY' eq ref $self->created ) and ( $self->test_machine->clear_test_data_all([ map {$_->{location}} @$self->created ]) );