mourningdove/t/paid-time.t
2026-05-24 01:03:05 +00:00

115 lines
3.2 KiB
Perl

# t/paid-time.t
#
# Test DW::Pay::add_paid_time.
#
# Authors:
# Jen Griffin <kareila@livejournal.com>
#
# Copyright (c) 2013 by Dreamwidth Studios, LLC.
#
# This program is free software; you may redistribute it and/or modify it under
# the same terms as Perl itself. For a copy of the license, please reference
# 'perldoc perlartistic' or 'perldoc perlgpl'.
#
use strict;
use warnings;
use Test::More tests => 8;
BEGIN { $LJ::_T_CONFIG = 1; require "$ENV{LJHOME}/cgi-bin/ljlib.pl"; }
use DW::Pay;
use LJ::Test qw (temp_user);
my $u1 = temp_user();
my $paidmos = 0;
my @lt = localtime();
my $mdays = LJ::days_in_month( $lt[4] + 1, $lt[5] + 1900 );
die "Could not calculate days in month" unless $mdays;
my $dbh = LJ::get_db_writer();
# reset, delete, etc
sub rst {
$dbh->do( 'DELETE FROM dw_paidstatus WHERE userid = ?', undef, $_ ) foreach ( $u1->id );
$paidmos = 0;
}
sub assert {
my ( $u, $type, $testname ) = @_;
local $Test::Builder::Level = $Test::Builder::Level + 1;
subtest $testname => sub {
plan tests => 4;
my ($typeid) = grep { ( $LJ::CAP{$_}->{_account_type} || "" ) eq $type } keys %LJ::CAP;
ok( $typeid, 'valid class' );
my $ps = DW::Pay::get_paid_status($u);
my $secs = 86400 * $paidmos;
$ps->{expiresin} = $secs if $type eq 'seed'; # not relevant to test
ok( $ps, 'got paid status' );
ok( $ps->{typeid} == $typeid, 'typeids match' );
ok( abs( $ps->{expiresin} - $secs ) < 60, 'secs match within a minute' );
}
}
################################################################################
rst();
# free->paid 1 month
DW::Pay::add_paid_time( $u1, 'paid', 1 )
or die DW::Pay::error_text();
$paidmos += $mdays; # 30
assert( $u1, 'paid', "free->paid 1 month" );
# paid +1 month
DW::Pay::add_paid_time( $u1, 'paid', 1 )
or die DW::Pay::error_text();
$paidmos += $mdays; # 60
assert( $u1, 'paid', "paid +1 month" );
# premium +1 month
DW::Pay::add_paid_time( $u1, 'premium', 1 )
or die DW::Pay::error_text();
$paidmos = $paidmos * 0.7 + $mdays;
# should be 72 days... they bought 1 month of premium time (30 days)
# and they had 60 days of paid. 60 days of paid converts to 42 days
# of premium, 42+30 = 72 days premium.
assert( $u1, 'premium', "premium +1 month" );
# premium +1 month
DW::Pay::add_paid_time( $u1, 'premium', 1 )
or die DW::Pay::error_text();
$paidmos += $mdays; # 102
assert( $u1, 'premium', "premium +1 month" );
# paid +1 month == premium +21 days
DW::Pay::add_paid_time( $u1, 'paid', 1 )
or die DW::Pay::error_text();
$paidmos += 21; # 123
assert( $u1, 'premium', "paid +1 month == premium +21 days" );
################################################################################
# seed account
DW::Pay::add_paid_time( $u1, 'seed', 99 )
or die DW::Pay::error_text();
# no additional paid time, but store old value for reference
assert( $u1, 'seed', "seed account" );
ok( !DW::Pay::add_paid_time( $u1, 'paid', 1 ), 'adding paid time fails' );
assert( $u1, 'seed', "seed account after trying to add paid time" );
################################################################################