2017-10-02 14:08:24 +01:00
use Mojo::Base - strict ;
use FindBin qw/ $Bin / ;
use Test::More ;
use Test::Pear::LocalLoop ;
use DateTime ;
my $ framework = Test::Pear::LocalLoop - > new (
etc_dir = > "$Bin/../../etc" ,
) ;
$ framework - > install_fixtures ( 'full' ) ;
my $ t = $ framework - > framework ;
my $ schema = $ t - > app - > schema ;
my $ dt_today = DateTime - > today ;
my $ dt_start = $ dt_today - > clone - > subtract ( 'minutes' = > 30 ) ;
use Devel::Dwarn ;
my $ session_key = $ framework - > login ( {
email = > 'test1@example.com' ,
password = > 'abc123' ,
} ) ;
sub create_transaction {
my ( $ value , $ time ) = @ _ ;
$ t - > ua - > post ( '/api/upload' = > json = > {
transaction_value = > $ value ,
transaction_type = > 1 ,
purchase_time = > $ time ,
organisation_id = > 1 ,
session_key = > $ session_key ,
} ) ;
}
my $ expected_days = { } ;
my $ expected_hours = { } ;
sub increment_day {
my ( $ value , $ day , $ distance ) = @ _ ;
$ value *= 100000 ;
2017-10-03 18:08:30 +01:00
$ distance // = 845 ;
2017-10-02 14:08:24 +01:00
$ expected_days - > { $ day } = {
quantised = > $ day ,
sum_value = > ( $ expected_days - > { $ day } - > { sum_value } || 0 ) + $ value ,
sum_distance = > ( $ expected_days - > { $ day } - > { sum_distance } || 0 ) + $ distance ,
count = > + + $ expected_days - > { $ day } - > { count } ,
} ;
}
sub increment_hour {
my ( $ value , $ day , $ distance ) = @ _ ;
$ value *= 100000 ;
2017-10-03 18:08:30 +01:00
$ distance // = 845 ;
2017-10-02 14:08:24 +01:00
$ expected_hours - > { $ day } = {
quantised = > $ day ,
sum_value = > ( $ expected_hours - > { $ day } - > { sum_value } || 0 ) + $ value ,
sum_distance = > ( $ expected_hours - > { $ day } - > { sum_distance } || 0 ) + $ distance ,
count = > + + $ expected_hours - > { $ day } - > { count } ,
} ;
}
for my $ i ( 0 .. 48 ) {
my $ dt = $ dt_start - > clone - > subtract ( 'minutes' = > 60 * $ i ) ;
my $ purchase_time = $ t - > app - > format_iso_datetime ( $ dt ) ;
my $ quantised_day = $ t - > app - > format_iso_datetime ( $ dt - > clone - > truncate ( to = > 'day' ) ) ;
my $ quantised_hour = $ t - > app - > format_iso_datetime ( $ dt - > clone - > truncate ( to = > 'hour' ) ) ;
create_transaction ( 10 , $ purchase_time ) ;
increment_day ( 10 , $ quantised_day ) ;
increment_hour ( 10 , $ quantised_hour ) ;
if ( $ i % 2 == 0 ) {
create_transaction ( 20 , $ purchase_time ) ;
increment_day ( 20 , $ quantised_day ) ;
increment_hour ( 20 , $ quantised_hour ) ;
}
if ( $ i % 3 == 0 ) {
create_transaction ( 30 , $ purchase_time ) ;
increment_day ( 30 , $ quantised_day ) ;
increment_hour ( 30 , $ quantised_hour ) ;
}
if ( $ i % 5 == 0 ) {
create_transaction ( 50 , $ purchase_time ) ;
increment_day ( 50 , $ quantised_day ) ;
increment_hour ( 50 , $ quantised_hour ) ;
}
if ( $ i % 7 == 0 ) {
create_transaction ( 70 , $ purchase_time ) ;
increment_day ( 70 , $ quantised_day ) ;
increment_hour ( 70 , $ quantised_hour ) ;
}
}
my $ expected_days_array = [ map {
my $ data = $ expected_days - > { $ _ } ;
{
quantised = > $ data - > { quantised } ,
count = > $ data - > { count } ,
sum_value = > $ data - > { sum_value } ,
sum_distance = > $ data - > { sum_distance } ,
average_value = > $ data - > { sum_value } / $ data - > { count } ,
average_distance = > $ data - > { sum_distance } / $ data - > { count } ,
}
} sort keys %$ expected_days ] ;
my $ expected_hours_array = [ map {
my $ data = $ expected_hours - > { $ _ } ;
{
quantised = > $ data - > { quantised } ,
count = > $ data - > { count } ,
sum_value = > $ data - > { sum_value } ,
sum_distance = > $ data - > { sum_distance } ,
average_value = > $ data - > { sum_value } / $ data - > { count } ,
average_distance = > $ data - > { sum_distance } / $ data - > { count } ,
}
} sort keys %$ expected_hours ] ;
is $ t - > app - > schema - > resultset ( 'Transaction' ) - > count , 108 , 'Transactions created' ;
#login to admin
$ t - > post_ok ( '/admin' , form = > {
email = > 'admin@example.com' ,
password = > 'abc123' ,
} ) - > status_is ( 302 ) ;
$ t - > get_ok (
'/admin/reports/transactions' ,
{ Accept = > 'application/json' }
)
- > status_is ( 200 )
- > json_is ( '/data' , $ expected_hours_array ) - > or ( $ framework - > dump_error ) ;
$ t - > get_ok (
'/admin/reports/transactions' ,
{ Accept = > 'application/json' } ,
form = > { scale = > 'days' }
)
- > status_is ( 200 )
- > json_is ( '/data' , $ expected_days_array ) - > or ( $ framework - > dump_error ) ;
done_testing ;