Тестування API
Ця сторінка містить практичні приклади тестування поточного бекенду (copy-paste).
Швидке отримання Sanctum Token (локальна розробка)
Використайте endpoint для випуску токена для наявного користувача у локальному debug-оточенні.
Endpoint:
POST /api/dev/token
Приклад:
curl -X POST "http://127.0.0.1:8000/api/dev/token" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"email": "student@techtutor.test",
"token_name": "frontend-dev-student",
"abilities": ["*"]
}'Якщо у backend .env задано DEV_TOKEN_KEY, додайте:
-H "X-Dev-Key: your-dev-key"Відповідь містить поле token. Далі використовуйте його як bearer token.
Перевірки безпеки auth
GET /api/app-config повертає runtime-налаштування, які використовує frontend для auth-форм.
Якщо CAPTCHA_ENABLED=true у .env, auth endpoint-и вимагають captcha_token.
Якщо CAPTCHA_ENABLED=false, auth endpoint-и приймають запити без CAPTCHA, а frontend не показує CAPTCHA UI.
До auth-маршрутів застосовано rate limit на сервері, тому повторні логін/реєстрація можуть повертати throttle error.
Базові змінні
BASE_URL="http://127.0.0.1:8000/api"
TOKEN="YOUR_SANCTUM_TOKEN"PowerShell:
$BASE_URL = "http://127.0.0.1:8000/api"
$TOKEN = "YOUR_SANCTUM_TOKEN"Публічні endpoint-и
Перевірка runtime config:
curl -X GET "$BASE_URL/app-config" \
-H "Accept: application/json"Список курсів:
curl -X GET "$BASE_URL/courses"Пошук/фільтрація каталогу:
curl -X GET "$BASE_URL/courses?q=laravel&category=backend&price_type=paid&sort=price_desc"Отримати один курс:
curl -X GET "$BASE_URL/courses/1"Реєстрація з CAPTCHA token (лише якщо CAPTCHA увімкнена):
curl -X POST "$BASE_URL/auth/register" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"name": "New Student",
"email": "new.student@example.com",
"password": "password123",
"password_confirmation": "password123",
"role": "student",
"token_name": "manual-test",
"captcha_token": "demo-captcha-token"
}'Логін з CAPTCHA token (лише якщо CAPTCHA увімкнена):
curl -X POST "$BASE_URL/auth/login" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"email":"student@techtutor.test","password":"password","token_name":"manual-test","captcha_token":"demo-captcha-token"}'Якщо CAPTCHA вимкнена, captcha_token слід прибрати з прикладів і реальних запитів.
Forgot/reset password:
curl -X POST "$BASE_URL/auth/forgot-password" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"email":"student@techtutor.test"}'curl -X POST "$BASE_URL/auth/reset-password" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"email":"student@techtutor.test","token":"RESET_TOKEN","password":"new-password123","password_confirmation":"new-password123"}'Автентифіковані endpoint-и (Sanctum)
Поточний користувач:
curl -X GET "$BASE_URL/auth/me" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Повторне надсилання email verification:
curl -X POST "$BASE_URL/auth/email/resend" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Logout:
curl -X POST "$BASE_URL/auth/logout" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Дашборд викладача:
curl -X GET "$BASE_URL/instructor/dashboard" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Моніторинг платформи адміна:
curl -X GET "$BASE_URL/admin/platform-dashboard" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Створення курсу:
curl -X POST "$BASE_URL/courses" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"title": "Laravel API Basics",
"slug": "laravel-api-basics",
"description": "Intro backend course",
"subtitle": "Build REST APIs with Laravel",
"category": "backend",
"level": "beginner",
"language": "en",
"thumbnail_path": "/courses/laravel-api-basics.png",
"duration_minutes": 180,
"price": 49.99,
"is_published": true
}'Створення модуля:
curl -X POST "$BASE_URL/courses/1/modules" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"title": "Module 1",
"slug": "module-1",
"position": 1
}'Створення уроку:
curl -X POST "$BASE_URL/modules/1/lessons" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"title": "Lesson 1",
"slug": "lesson-1",
"type": "text",
"content": "Hello TechTutor",
"position": 1,
"is_preview": false
}'Запис на курс:
curl -X POST "$BASE_URL/courses/1/enrollments" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Для paid-курсів без попередньої оплати endpoint повертає 402.
Покупка paid-курсу з отриманням квитанції:
curl -X POST "$BASE_URL/courses/1/payments" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"provider": "manual_demo",
"amount": 49.99,
"currency": "USD",
"transaction_id": "txn_manual_demo_1001",
"provider_payload": {
"source": "manual_test"
}
}'Створення Stripe Checkout session:
curl -X POST "$BASE_URL/courses/1/payments/stripe-checkout" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"success_url": "http://127.0.0.1:5173/payment/success",
"cancel_url": "http://127.0.0.1:5173/payment/cancel"
}'Локальний запуск Stripe webhook forwarding:
stripe login
stripe listen --forward-to http://127.0.0.1:8000/api/stripe/webhook --events checkout.session.completedСкопіюйте whsec_... у backend .env:
STRIPE_WEBHOOK_SECRET=whsec_...Після цього, за потреби, очистьте config cache:
php artisan config:clearОновлення прогресу уроку:
curl -X POST "$BASE_URL/lessons/1/progress" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"progress_percent": 100
}'Список сертифікатів:
curl -X GET "$BASE_URL/certificates" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Ручна перевірка права на сертифікат:
curl -X POST "$BASE_URL/courses/1/certificate" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Створення квізу:
curl -X POST "$BASE_URL/courses/1/quizzes" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"title": "Final Quiz",
"description": "Module checkpoint",
"pass_score": 60,
"is_published": true,
"questions": [
{
"type": "single_choice",
"prompt": "Which package protects API routes?",
"options": [
{ "key": "sanctum", "text": "Laravel Sanctum", "is_correct": true },
{ "key": "vite", "text": "Vite" }
]
},
{
"type": "multiple_choice",
"prompt": "Which items are backend responsibilities?",
"points": 2,
"options": [
{ "key": "policies", "text": "Policies", "is_correct": true },
{ "key": "middleware", "text": "Middleware", "is_correct": true },
{ "key": "tailwind", "text": "Tailwind classes" }
]
}
]
}'Надсилання спроби квізу:
curl -X POST "$BASE_URL/quizzes/1/attempts" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"answers": {
"1": "sanctum",
"2": ["middleware", "policies"]
}
}'Аналітика квізу:
curl -X GET "$BASE_URL/quizzes/1/analytics" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json"Створення відгуку:
curl -X POST "$BASE_URL/courses/1/reviews" \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"rating": 5,
"comment": "Great course"
}'Publish request workflow (тестування)
- Згенеруйте dev token для викладача.
- Викладач створює чернетку з
request_publish: true. - Адмін схвалює запит через
PATCH /courses/{courseId}зis_published: true. - Або адмін відхиляє через
decline_publish: trueі optional reason.
Цей процес зберігає записи у publish_requests і надсилає email-сповіщення викладачу.
Google OAuth тестування
Передумови
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
GOOGLE_REDIRECT_URI=http://127.0.0.1:8000/auth/google/callbackНалаштуйте OAuth credentials у Google Cloud Console і додайте redirect URI:
http://127.0.0.1:8000/auth/google/callback
Ручне тестування у браузері
- Відкрийте:
http://127.0.0.1:8000/auth/google/redirect?return_to=http://localhost:5173
- Увійдіть через Google.
- Бекенд обробить callback і поверне popup HTML з
window.postMessage()payload. - Popup закриється автоматично за наявності opener-вікна.
Автотести з моками
OAuth flow покритий у:
tests/Feature/AuthFlowTest.php
Запуск:
php artisan test tests/Feature/AuthFlowTest.php --filter=googlePostman тестування
Змінні оточення
baseUrl=http://127.0.0.1:8000/apitoken= ваш Sanctum tokencourseId=1moduleId=1lessonId=1quizId=1
Авторизація
На рівні колекції:
- Type: Bearer Token
- Token:
{{token}}
Рекомендований порядок запитів
GET {{baseUrl}}/coursesPOST {{baseUrl}}/auth/loginGET {{baseUrl}}/auth/mePOST {{baseUrl}}/coursesPOST {{baseUrl}}/courses/{{courseId}}/modulesPOST {{baseUrl}}/modules/{{moduleId}}/lessonsPOST {{baseUrl}}/courses/{{courseId}}/enrollmentsPOST {{baseUrl}}/lessons/{{lessonId}}/progressPOST {{baseUrl}}/courses/{{courseId}}/quizzesPOST {{baseUrl}}/quizzes/{{quizId}}/attemptsPOST {{baseUrl}}/courses/{{courseId}}/reviewsPOST {{baseUrl}}/courses/{{courseId}}/payments
Швидке усунення проблем
401 Unauthorized: відсутній або невалідний bearer token.403 Forbidden: рольові або enrollment-обмеження.422 Unprocessable Entity: помилка валідації тіла запиту.404 Not Found: вкладені ID не відповідають одне одному.