279 lines
7.4 KiB
Markdown
279 lines
7.4 KiB
Markdown
# How to Test the New Admin Questions API
|
|
|
|
## Quick Start
|
|
|
|
### 1. Ensure Backend is Running
|
|
```bash
|
|
cd backend
|
|
npm start
|
|
```
|
|
|
|
The server should be running on `http://localhost:3000`
|
|
|
|
### 2. Run the Test Suite
|
|
```bash
|
|
node test-admin-questions-pagination.js
|
|
```
|
|
|
|
## What Gets Tested
|
|
|
|
The test suite automatically:
|
|
1. ✅ Logs in as admin user
|
|
2. ✅ Creates a regular test user
|
|
3. ✅ Starts a guest session
|
|
4. ✅ Creates 8 test questions with different properties
|
|
5. ✅ Runs 35 comprehensive tests
|
|
6. ✅ Cleans up all test data
|
|
|
|
## Test Categories
|
|
|
|
### Authorization (3 tests)
|
|
- Guest access denial
|
|
- Regular user access denial
|
|
- Admin access granted
|
|
|
|
### Pagination (8 tests)
|
|
- Default pagination
|
|
- Custom page sizes
|
|
- Metadata accuracy
|
|
- Limit enforcement
|
|
- Invalid page handling
|
|
|
|
### Search (4 tests)
|
|
- Search question text
|
|
- Search explanations
|
|
- No results handling
|
|
- Special characters
|
|
|
|
### Filters (6 tests)
|
|
- By difficulty (easy/medium/hard)
|
|
- By category
|
|
- Invalid UUID handling
|
|
|
|
### Combined Filters (4 tests)
|
|
- Search + difficulty
|
|
- Search + category
|
|
- Category + difficulty
|
|
- All filters together
|
|
|
|
### Sorting (5 tests)
|
|
- By creation date
|
|
- By points
|
|
- By difficulty
|
|
- Invalid sort fields
|
|
|
|
### Response Structure (4 tests)
|
|
- Response format validation
|
|
- Required fields check
|
|
- Category object structure
|
|
- Filter reflection
|
|
|
|
### Edge Cases (3 tests)
|
|
- Empty searches
|
|
- Out of range pages
|
|
- Accuracy calculations
|
|
|
|
## Manual Testing
|
|
|
|
### Get All Questions (First Page)
|
|
```bash
|
|
curl "http://localhost:3000/api/admin/questions" \
|
|
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
|
```
|
|
|
|
### Search for Questions
|
|
```bash
|
|
curl "http://localhost:3000/api/admin/questions?search=javascript" \
|
|
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
|
```
|
|
|
|
### Filter by Difficulty
|
|
```bash
|
|
curl "http://localhost:3000/api/admin/questions?difficulty=medium&limit=20" \
|
|
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
|
```
|
|
|
|
### Filter by Category
|
|
```bash
|
|
# Replace with actual category UUID from your database
|
|
curl "http://localhost:3000/api/admin/questions?category=68b4c87f-db0b-48ea-b8a4-b2f4fce785a2" \
|
|
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
|
```
|
|
|
|
### Paginate Through Questions
|
|
```bash
|
|
# Page 1
|
|
curl "http://localhost:3000/api/admin/questions?page=1&limit=10" \
|
|
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
|
|
|
# Page 2
|
|
curl "http://localhost:3000/api/admin/questions?page=2&limit=10" \
|
|
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
|
```
|
|
|
|
### Sort Questions
|
|
```bash
|
|
# By points (highest first)
|
|
curl "http://localhost:3000/api/admin/questions?sortBy=points&order=DESC" \
|
|
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
|
|
|
# By creation date (oldest first)
|
|
curl "http://localhost:3000/api/admin/questions?sortBy=createdAt&order=ASC" \
|
|
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
|
```
|
|
|
|
### Complex Query
|
|
```bash
|
|
curl "http://localhost:3000/api/admin/questions?search=async&difficulty=medium&sortBy=points&order=DESC&page=1&limit=15" \
|
|
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
|
```
|
|
|
|
## Get Admin Token
|
|
|
|
### Option 1: From Test Output
|
|
Run any test file that logs in as admin and look for the token in console.
|
|
|
|
### Option 2: Login Manually
|
|
```bash
|
|
curl -X POST "http://localhost:3000/api/auth/login" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{
|
|
"email": "admin@quiz.com",
|
|
"password": "Admin@123"
|
|
}'
|
|
```
|
|
|
|
The token will be in `response.data.data.token`
|
|
|
|
## Expected Test Output
|
|
|
|
```
|
|
========================================
|
|
Testing Admin Questions Pagination & Search API
|
|
========================================
|
|
|
|
Setting up test data...
|
|
|
|
✓ Logged in as admin
|
|
✓ Created and logged in as regular user
|
|
✓ Started guest session
|
|
✓ Created 8 test questions
|
|
|
|
--- Authorization Tests ---
|
|
|
|
✓ Test 1: Guest cannot access admin questions endpoint - PASSED
|
|
✓ Test 2: Regular user cannot access admin questions endpoint - PASSED
|
|
✓ Test 3: Admin can access questions endpoint - PASSED
|
|
|
|
--- Pagination Tests ---
|
|
|
|
✓ Test 4: Default pagination (page 1, limit 10) - PASSED
|
|
✓ Test 5: Custom pagination (page 2, limit 5) - PASSED
|
|
✓ Test 6: Pagination metadata is correct - PASSED
|
|
✓ Test 7: Maximum limit enforcement (max 100) - PASSED
|
|
✓ Test 8: Invalid page defaults to 1 - PASSED
|
|
|
|
--- Search Tests ---
|
|
|
|
✓ Test 9: Search by question text (async) - PASSED
|
|
✓ Test 10: Search by explanation text (promise) - PASSED
|
|
✓ Test 11: Search with no results - PASSED
|
|
✓ Test 12: Search with special characters is handled - PASSED
|
|
|
|
--- Filter Tests ---
|
|
|
|
✓ Test 13: Filter by difficulty (easy) - PASSED
|
|
✓ Test 14: Filter by difficulty (medium) - PASSED
|
|
✓ Test 15: Filter by difficulty (hard) - PASSED
|
|
✓ Test 16: Filter by category (JavaScript) - PASSED
|
|
✓ Test 17: Filter by category (Node.js) - PASSED
|
|
✓ Test 18: Invalid category UUID is ignored - PASSED
|
|
|
|
--- Combined Filter Tests ---
|
|
|
|
✓ Test 19: Search + difficulty filter - PASSED
|
|
✓ Test 20: Search + category filter - PASSED
|
|
✓ Test 21: Category + difficulty filter - PASSED
|
|
✓ Test 22: All filters combined - PASSED
|
|
|
|
--- Sorting Tests ---
|
|
|
|
✓ Test 23: Sort by createdAt DESC (default) - PASSED
|
|
✓ Test 24: Sort by createdAt ASC - PASSED
|
|
✓ Test 25: Sort by difficulty - PASSED
|
|
✓ Test 26: Sort by points DESC - PASSED
|
|
✓ Test 27: Invalid sort field defaults to createdAt - PASSED
|
|
|
|
--- Response Structure Tests ---
|
|
|
|
✓ Test 28: Response has correct structure - PASSED
|
|
✓ Test 29: Each question has required fields - PASSED
|
|
✓ Test 30: Category object has required fields - PASSED
|
|
✓ Test 31: Filters object in response matches query - PASSED
|
|
✓ Test 32: Admin can see correctAnswer field - PASSED
|
|
|
|
--- Performance & Edge Cases ---
|
|
|
|
✓ Test 33: Empty search string returns all questions - PASSED
|
|
✓ Test 34: Page beyond total pages returns empty array - PASSED
|
|
✓ Test 35: Accuracy is calculated correctly - PASSED
|
|
|
|
========================================
|
|
Cleaning up test data...
|
|
========================================
|
|
|
|
✓ Deleted 8 test questions
|
|
|
|
========================================
|
|
Test Summary
|
|
========================================
|
|
Total Tests: 35
|
|
Passed: 35 ✓
|
|
Failed: 0 ✗
|
|
Success Rate: 100.00%
|
|
========================================
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### "Setup failed: Network Error"
|
|
- Ensure backend server is running on port 3000
|
|
- Check if database connection is working
|
|
|
|
### "Admin login failed"
|
|
- Verify admin user exists in database
|
|
- Check credentials: email: `admin@quiz.com`, password: `Admin@123`
|
|
|
|
### "Category not found"
|
|
- Run seeders to populate categories
|
|
- Check CATEGORY_IDS in test file match your database
|
|
|
|
### Tests fail with 500 errors
|
|
- Check backend logs for detailed error messages
|
|
- Ensure all required models are properly defined
|
|
- Verify database schema is up to date
|
|
|
|
## Documentation
|
|
|
|
- **API Documentation:** See `ADMIN_QUESTIONS_API.md`
|
|
- **Implementation Summary:** See `QUESTIONS_API_IMPLEMENTATION_SUMMARY.md`
|
|
- **Controller Code:** See `controllers/question.controller.js` - `getAllQuestions` method
|
|
- **Route Definition:** See `routes/admin.routes.js`
|
|
|
|
## Related Test Files
|
|
|
|
- `test-create-question.js` - Test question creation
|
|
- `test-update-delete-question.js` - Test updates and deletions
|
|
- `test-questions-by-category.js` - Test public category endpoint
|
|
- `test-question-search.js` - Test public search endpoint
|
|
- `test-question-by-id.js` - Test single question retrieval
|
|
|
|
## Next Steps
|
|
|
|
After successful testing:
|
|
1. ✅ Review the API documentation
|
|
2. ✅ Integrate with frontend admin dashboard
|
|
3. ✅ Implement Angular Material paginator
|
|
4. ✅ Add search and filter UI components
|
|
5. ✅ Create question management interface
|