From 7b3467ee700cd95711270d7fa1c0ce32b193da98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A1ndor=20M=C3=A1t=C3=A9=20Magony?= Date: Fri, 2 May 2025 16:57:39 +0200 Subject: [PATCH] =?UTF-8?q?K=C3=A9sz=20tesztel=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/Http/Controllers/WcController.php | 20 ++++- Backend/laravel9/app/Models/Keruletek.php | 5 ++ .../database/factories/KeruletekFactory.php | 23 ++++++ .../database/factories/UserFactory.php | 22 +----- .../database/factories/WcAdatokFactory.php | 32 ++++++++ .../tests/Feature/MosdoTorlesTest.php | 55 ++++++++++++++ .../src/WC_Komponens/Budi_Blokk/Csempe.jsx | 5 +- .../WC_Komponens/Budi_Blokk/Csempe.test.jsx | 76 +++++++++++++++++++ 8 files changed, 215 insertions(+), 23 deletions(-) create mode 100644 Backend/laravel9/database/factories/KeruletekFactory.php create mode 100644 Backend/laravel9/database/factories/WcAdatokFactory.php create mode 100644 Backend/laravel9/tests/Feature/MosdoTorlesTest.php create mode 100644 frontend/peepal_react/src/WC_Komponens/Budi_Blokk/Csempe.test.jsx diff --git a/Backend/laravel9/app/Http/Controllers/WcController.php b/Backend/laravel9/app/Http/Controllers/WcController.php index 9544e22..b915f5c 100644 --- a/Backend/laravel9/app/Http/Controllers/WcController.php +++ b/Backend/laravel9/app/Http/Controllers/WcController.php @@ -85,13 +85,25 @@ class WcController extends Controller public function destroy($id) { + if (!auth('api')->check()) { + return response()->json(['message' => 'Nincs bejelentkezve'], 401); + } + + $user = auth('api')->user(); + + if (!$user->is_admin) { + return response()->json(['message' => 'Nincs jogosultság'], 403); + } + $mosdo = WcAdatok::find($id); - if($mosdo){ - $mosdo -> delete(); - return response() -> json(['message' => 'Sikeres törlés'], 200); + if ($mosdo) { + $mosdo->delete(); + return response()->json(['message' => 'Sikeres törlés'], 200); } else { - return response() -> json(['message' => 'Nem található'], 404); + return response()->json(['message' => 'Nem található'], 404); } } + + } diff --git a/Backend/laravel9/app/Models/Keruletek.php b/Backend/laravel9/app/Models/Keruletek.php index 6b3779d..041258f 100644 --- a/Backend/laravel9/app/Models/Keruletek.php +++ b/Backend/laravel9/app/Models/Keruletek.php @@ -2,6 +2,7 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Keruletek extends Model @@ -10,5 +11,9 @@ class Keruletek extends Model return $this->hasMany(WcAdatok::class); } + use HasFactory; + protected $table = 'keruletek'; + + public $timestamps = false; } diff --git a/Backend/laravel9/database/factories/KeruletekFactory.php b/Backend/laravel9/database/factories/KeruletekFactory.php new file mode 100644 index 0000000..e9f5fdf --- /dev/null +++ b/Backend/laravel9/database/factories/KeruletekFactory.php @@ -0,0 +1,23 @@ + + */ +class KeruletekFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'kerulet_nev' => 'X. kerület' + ]; + } +} diff --git a/Backend/laravel9/database/factories/UserFactory.php b/Backend/laravel9/database/factories/UserFactory.php index d6ca926..b5d5fa4 100644 --- a/Backend/laravel9/database/factories/UserFactory.php +++ b/Backend/laravel9/database/factories/UserFactory.php @@ -18,25 +18,11 @@ class UserFactory extends Factory public function definition() { return [ - 'name' => $this->faker->name(), + 'nev' => $this->faker->name(), 'email' => $this->faker->unique()->safeEmail(), - 'email_verified_at' => now(), - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password - 'remember_token' => Str::random(10), + 'felh_nev' => $this->faker->userName(), + 'jelszo' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'is_admin' => false, ]; } - - /** - * Indicate that the model's email address should be unverified. - * - * @return \Illuminate\Database\Eloquent\Factories\Factory - */ - public function unverified() - { - return $this->state(function (array $attributes) { - return [ - 'email_verified_at' => null, - ]; - }); - } } diff --git a/Backend/laravel9/database/factories/WcAdatokFactory.php b/Backend/laravel9/database/factories/WcAdatokFactory.php new file mode 100644 index 0000000..95dffd4 --- /dev/null +++ b/Backend/laravel9/database/factories/WcAdatokFactory.php @@ -0,0 +1,32 @@ + + */ +class WcAdatokFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'nev' => $this->faker->name(), + 'kerulet_id' => 1, + 'kozeli_megall' => $this->faker->text(), + 'akadalym' => false, + 'ar' => 200, + 'nyitva' => '0:00 - 24:00', + 'hossz_koord' => 47.4979, + 'szel_koord' => 19.0402, + 'utvonal' => 'maps.google.com', + 'felhasznalo_id' => 1 + ]; + } +} diff --git a/Backend/laravel9/tests/Feature/MosdoTorlesTest.php b/Backend/laravel9/tests/Feature/MosdoTorlesTest.php new file mode 100644 index 0000000..58a7e80 --- /dev/null +++ b/Backend/laravel9/tests/Feature/MosdoTorlesTest.php @@ -0,0 +1,55 @@ +create(['is_admin' => true]); + + // 2. Teszt mosdó + $kerulet = Keruletek::factory()->create(); + $mosdo = WcAdatok::factory()->create(['kerulet_id' => $kerulet->id, 'felhasznalo_id' => $admin->id]); + + // 3. Token generálás és kérés küldés + $response = $this->actingAs($admin, 'api') + ->deleteJson("/api/mosdotorles/{$mosdo->id}"); + + $response->assertStatus(200); + $this->assertDatabaseMissing('wc_adatok', ['id' => $mosdo->id]); + } + + public function test_nem_admin_nem_torolhet() + { + $user = User::factory()->create(['is_admin' => false]); + $kerulet = Keruletek::factory()->create(); + $mosdo = WcAdatok::factory()->create(['kerulet_id' => $kerulet->id, 'felhasznalo_id' => $user->id]); + + $response = $this->actingAs($user, 'api') + ->deleteJson("/api/mosdotorles/{$mosdo->id}"); + + $response->assertStatus(403); + $this->assertDatabaseHas('wc_adatok', ['id' => $mosdo->id]); + } + + public function test_anonim_felhasznalo_nem_torolhet() + { + $kerulet = Keruletek::factory()->create(); + $user = User::factory()->create(['is_admin' => false]); + $mosdo = WcAdatok::factory()->create(['kerulet_id' => $kerulet->id, 'felhasznalo_id' => $user->id]); + + $response = $this->deleteJson("/api/mosdotorles/{$mosdo->id}"); + + $response->assertStatus(401); + } +} diff --git a/frontend/peepal_react/src/WC_Komponens/Budi_Blokk/Csempe.jsx b/frontend/peepal_react/src/WC_Komponens/Budi_Blokk/Csempe.jsx index 1091664..7edbf36 100644 --- a/frontend/peepal_react/src/WC_Komponens/Budi_Blokk/Csempe.jsx +++ b/frontend/peepal_react/src/WC_Komponens/Budi_Blokk/Csempe.jsx @@ -48,7 +48,10 @@ export default function Csempe() { if (loading) { return(
-
+
); } diff --git a/frontend/peepal_react/src/WC_Komponens/Budi_Blokk/Csempe.test.jsx b/frontend/peepal_react/src/WC_Komponens/Budi_Blokk/Csempe.test.jsx new file mode 100644 index 0000000..376af9b --- /dev/null +++ b/frontend/peepal_react/src/WC_Komponens/Budi_Blokk/Csempe.test.jsx @@ -0,0 +1,76 @@ +import React from 'react'; +import { render, screen, waitFor, fireEvent } from '@testing-library/react'; +import Csempe from './Csempe'; +import { useAuth } from '../Bejel_Regisz/AuthContext'; +import * as fetchModule from '../../apiFetch'; + +// AuthContext mock +jest.mock('../Bejel_Regisz/AuthContext', () => ({ + useAuth: jest.fn() +})); + +// mosdokFetch mock +jest.mock('../../apiFetch', () => ({ + mosdokFetch: jest.fn() +})); + +describe('Csempe komponens', () => { + const mockMosdok = [ + { + id: 1, + nev: 'Nyilvános WC', + kerulet: { kerulet_nev: 'V. kerület' }, + kozeli_megall: 'Astoria', + ar: 200, + nyitva: '0-24', + akadalym: 1, + utvonal: 'https://maps.example.com/utvonal' + } + ]; + + beforeEach(() => { + fetch.resetMocks?.(); // ha használsz jest-fetch-mock-ot + jest.clearAllMocks(); + }); + + test('Adminnak megjelenik a Törlés gomb', async () => { + useAuth.mockReturnValue({ user: { is_admin: true } }); + fetchModule.mosdokFetch.mockResolvedValue(mockMosdok); + + render(); + + await waitFor(() => { + expect(screen.getByText(/Törlés/i)).toBeInTheDocument(); + }); + }); + + test('Nem adminnak nem jelenik meg a Törlés gomb', async () => { + useAuth.mockReturnValue({ user: { is_admin: false } }); + fetchModule.mosdokFetch.mockResolvedValue(mockMosdok); + + render(); + + await waitFor(() => { + expect(screen.queryByText(/Törlés/i)).not.toBeInTheDocument(); + }); + }); + + test('Hiba esetén megjelenik hibaüzenet', async () => { + useAuth.mockReturnValue({ user: { is_admin: true } }); + fetchModule.mosdokFetch.mockResolvedValue(null); + + render(); + + await waitFor(() => { + expect(screen.getByText(/Nem sikerült betölteni/i)).toBeInTheDocument(); + }); + }); + + test('Betöltés alatt megjelenik spinner', async () => { + useAuth.mockReturnValue({ user: { is_admin: true } }); + fetchModule.mosdokFetch.mockImplementation(() => new Promise(() => {})); // never resolves + + render(); + expect(screen.getByRole('status')).toBeInTheDocument(); // a spinner div-ben legyen pl. role="status" + }); +});