HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: /home/xedaptot/ai.naniguide.com/tests/Unit/CreditTrackerTest.php
<?php

use App\Library\CreditTracker;
use App\Library\Exception\OutOfCredits;

use function App\Helpers\execute_with_limits;

test('Credit tracker just works', function () {
    $file = '/tmp/test-rate-'.uniqid();
    $tracker = new CreditTracker($file, $createFile = true);

    expect($tracker->getRemainingCredits())->toBe(CreditTracker::ZERO);
    expect($tracker->isZero())->toBe(true);
    expect($tracker->isUnlimited())->toBe(false);

    $tracker->setCredits(2);
    expect($tracker->getRemainingCredits())->toBe(2);
    expect($tracker->isZero())->toBe(false);
    expect($tracker->isUnlimited())->toBe(false);

    // Count to deduct credit
    $tracker->count();
    expect($tracker->getRemainingCredits())->toBe(1);

    // Count to deduct credit
    $tracker->count();
    expect($tracker->getRemainingCredits())->toBe(0);
});

test('Credit tracker with unlimited credits', function () {
    $file = '/tmp/test-rate-'.uniqid();
    $tracker = new CreditTracker($file, $createFile = true);

    expect($tracker->getRemainingCredits())->toBe(CreditTracker::ZERO);

    $tracker->setCredits(-1);
    expect($tracker->getRemainingCredits())->toBe(CreditTracker::UNLIMITED);
    expect($tracker->isUnlimited())->toBe(true);

    // Count to deduct credit
    $tracker->count();
    expect($tracker->getRemainingCredits())->toBe(CreditTracker::UNLIMITED);
    expect($tracker->isUnlimited())->toBe(true);

    // Test with execute_with_limits() helper
    $task = fn () => execute_with_limits([  ], null, [ $tracker ]);

    $task();
    expect($tracker->getRemainingCredits())->toBe(CreditTracker::UNLIMITED);
    expect($tracker->isUnlimited())->toBe(true);

    $task();
    expect($tracker->getRemainingCredits())->toBe(CreditTracker::UNLIMITED);
    expect($tracker->isUnlimited())->toBe(true);
});

test('Credit tracker should throw OutOfCredits', function () {
    $file = '/tmp/test-rate-'.uniqid();
    $tracker = new CreditTracker($file, $createFile = true);
    $tracker->setCredits(1);   // credits = 1
    $tracker->count();         // credits = 0

    expect($tracker->getRemainingCredits())->toBe(CreditTracker::ZERO);

    // Since credit is already ZERO, another count() shall throw an exception
    $tracker->count();
})->throws(OutOfCredits::class);


test('Cannot assign invalid values for CreditTracker (non-int)', function () {
    $file = '/tmp/test-rate-'.uniqid();
    $tracker = new CreditTracker($file, $createFile = true);
    $tracker->setCredits('xxxxx');   // invalid
})->throws(Exception::class);

test('Cannot assign invalid values for CreditTracker (<-1)', function () {
    $file = '/tmp/test-rate-'.uniqid();
    $tracker = new CreditTracker($file, $createFile = true);
    $tracker->setCredits(-2);   // invalid
})->throws(Exception::class);


test("Top-up credits", function () {
    $key1 = '/tmp/credit-tracker-test-1-'.uniqid();
    $creditTracker1 = new CreditTracker($key1, $createFile = true);
    $creditTracker1->setCredits(100);
    $creditTracker1->topup(1);
    expect($creditTracker1->getRemainingCredits())->toBe(101);
    $creditTracker1->topup(5);
    expect($creditTracker1->getRemainingCredits())->toBe(106);
    $creditTracker1->topup(10);
    expect($creditTracker1->getRemainingCredits())->toBe(116);

    try {
        $creditTracker1->setCredits(CreditTracker::UNLIMITED);
        $creditTracker1->topup(1);

        throw new Exception('Tasks did not throw an exception, something went wrong');
    } catch (Exception $e) {
        // Falling here
    }
});