Currency Api Dashboard

TypeScript

Modern currency exchange rate dashboard with real-time market data, conversion tools, analytics, historical trends, and responsive admin interface.

Stars
18
Forks
1
Downloads
N/A
Open Issues
0
Files main

Repository Files

Loading file structure...
tests/Feature/TokenManagementTest.php
<?php

use App\Models\Tokens;
use App\Models\User;
use Illuminate\Support\Facades\Cache;

beforeEach(function () {
    Tokens::truncate();
    User::truncate();
    Cache::flush();
});

test('authenticated user can generate a token', function () {
    $user = User::factory()->create();

    $response = $this->actingAs($user)
        ->post('/tokens', [
            'name' => 'Prod Server Key',
            'default_currency' => 'INR',
        ]);

    $response->assertRedirect();
    $this->assertDatabaseHas('tokens', [
        'user_id' => $user->id,
        'name' => 'Prod Server Key',
        'default_currency' => 'INR',
        'active' => true,
    ]);

    $token = Tokens::first();
    expect($token->token)->toStartWith('oxr_');

    // Check it was cached
    expect(Cache::has('TOKEN:'.$token->token))->toBeTrue();
});

test('authenticated user can generate a token with default currency defaulting to INR', function () {
    $user = User::factory()->create();

    $response = $this->actingAs($user)
        ->post('/tokens', [
            'name' => 'Blank Currency Key',
            'default_currency' => '',
        ]);

    $response->assertRedirect();
    $this->assertDatabaseHas('tokens', [
        'user_id' => $user->id,
        'name' => 'Blank Currency Key',
        'default_currency' => 'INR',
        'active' => true,
    ]);

    $token = Tokens::first();
    expect($token->token)->toStartWith('oxr_');
    expect($token->default_currency)->toEqual('INR');
});

test('user can toggle active status of a token', function () {
    $user = User::factory()->create();
    $token = Tokens::create([
        'user_id' => $user->id,
        'name' => 'Web App',
        'token' => 'oxr_my_token_key',
        'default_currency' => 'USD',
        'active' => true,
    ]);

    // Pre-cache
    Cache::put('TOKEN:oxr_my_token_key', $token, 3600);

    // Toggle status (Active -> Disabled)
    $response = $this->actingAs($user)
        ->patch("/tokens/{$token->id}/toggle");

    $response->assertRedirect();
    expect($token->fresh()->active)->toBeFalse();
    expect(Cache::has('TOKEN:oxr_my_token_key'))->toBeFalse();

    // Toggle status back (Disabled -> Active)
    $this->actingAs($user)->patch("/tokens/{$token->id}/toggle");
    expect($token->fresh()->active)->toBeTrue();
    expect(Cache::has('TOKEN:oxr_my_token_key'))->toBeTrue();
});

test('user can regenerate their token key', function () {
    $user = User::factory()->create();
    $token = Tokens::create([
        'user_id' => $user->id,
        'name' => 'Integrator Key',
        'token' => 'oxr_old_key',
        'default_currency' => 'USD',
        'active' => true,
    ]);

    Cache::put('TOKEN:oxr_old_key', $token, 3600);

    $response = $this->actingAs($user)
        ->post("/tokens/{$token->id}/regenerate");

    $response->assertRedirect();

    $token = $token->fresh();
    expect($token->token)->not->toEqual('oxr_old_key');
    expect($token->token)->toStartWith('oxr_');

    // Cache should be updated
    expect(Cache::has('TOKEN:oxr_old_key'))->toBeFalse();
    expect(Cache::has('TOKEN:'.$token->token))->toBeTrue();
});

test('user can revoke and delete their token', function () {
    $user = User::factory()->create();
    $token = Tokens::create([
        'user_id' => $user->id,
        'name' => 'To Revoke',
        'token' => 'oxr_soon_to_be_deleted',
        'default_currency' => 'USD',
        'active' => true,
    ]);

    Cache::put('TOKEN:oxr_soon_to_be_deleted', $token, 3600);

    $response = $this->actingAs($user)
        ->delete("/tokens/{$token->id}");

    $response->assertRedirect();
    $this->assertDatabaseMissing('tokens', ['id' => $token->id]);
    expect(Cache::has('TOKEN:oxr_soon_to_be_deleted'))->toBeFalse();
});