Imam problem pri pravljenju malo jaceg boilerplatea za API-je. Elem, sve radi kako treba ali mi test puca kada gadjam endpoint za logout ukoliko sam ulogovan korisnik. Postoje dva problema,
- Kada importujem, tj "use Tymon\JWTAuth\JWT" na vrhu testa, dobijam gresku pri pozivanju metode JWTAuth::userFrom jer je naravno pozivam staticki - a svuda na netu je tako pozivaju;
- Kada importujem samo naziv klase "JWTAuth" sve radi?! Naravno, PHPStorm prijavljuje gresku da klasa nije definisana kada prevucem kursor preko nje, kada prevucem kursor preko staticke metode u testu pise mi da klasa nije definisana ALI dobijem validan token i test prodje?!?!
Da ne duzim, ostavicu samo relevantan deo koda. Prvi slucaj kada sve radi:
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Namshi\JOSE\Test\SimpleJWSTest;
use Tests\TestCase;
use App\User;
//use Tymon\JWTAuth\Contracts\JWTSubject;
//use Tymon\JWTAuth\Contracts\Providers\JWT;
//use Tymon\JWTAuth\Facades\JWTFactory;
//use Tymon\JWTAuth\Facades\JWTProvider;
use JWTAuth; //tests fail if using default namespace for class
// ovde ide gomila testova, ovo gore se samo importovalo zbog prokletog PHPStorma a nikad se ne koristi, u potpunosti je YAGNI i komentovao sam ga dok ne vidim skroz da ga obrisem
public function testLoggedInUserLogout() {
$user = factory(User::class)->make();
$this->actingAs($user)->assertAuthenticated('api');
$user->save();
$credentials = $this->json('POST', '/api/login', [
'email' => $user->email,
'password' => 'password'
]);
// $token = $credentials->json('token');
$token = JWTAuth::fromUser($user);
//TODO DRY this out
$response = $this->actingAs($user)->postJson('/api/logout', [], [
'token_type' => 'bearer',
'access_token' => $token
]);
$response->assertStatus(200);
}
Znaci, uspesno dolazim do endpointa i dobijam status 200. Dalje asertacije nisam pisao, za pocetak mi je bitno da dobijem bar toliko. Prva suluda stvar je sto sam komentovao zadavanje $token promenljive preko $credentials objekta, a ukoliko skroz komentujem gadjanje login endpointa, tacnije zadavanje $credentials dobijam status 500 :D
Ukoliko navedem pun namespace, "Tymon\JWTAuth\JWT", puca test i dobijam gresku da staticki pozivam metodu.
---
Znaci cilj je da bez gadjanja login rute izvucem token koji bi trebalo da dobijem uz pomoc fromUser metode koju ne mogu da pozovem, a svuda se poziva staticki, pripada toj klasi JWTAuth, znam da ko god koristi Laravel sigurno ima iskustva s njom. Kako da ciljam endpoint validnim tokenom koji se ne cuva u bazi vec moram da ga iscupam iz objekta a da koristim actingAs? :D
Elem, sve ovo je zbog toga sto hocu da napravim boilerplate sa stub-ovima preko php artisan komande za instant pravljenje API-ja kad mi to zatreba. Ovaj kod gore mora nekako da se sredi, a kako bih testovima zadrzao "privatnost", ne bih da definisem token kao neku private promenljivu u testu vec da bude nezavisan.
Nadam se da sam koliko toliko objasnio sta mi treba, znaci glavni i verovatno jedini problem je sto ne mogu da iscupam token od korisnika kog generisem (User klasa). Da batalim to i koristim auth helper?