This project includes comprehensive unit tests for all API routes using Jest and Supertest. The tests use a separate test database to ensure data isolation and prevent interference with development data.
src/tests/
├── config/
│ └── testConfig.js # Test environment configuration
├── routes/
│ ├── auth.test.js # Authentication route tests
│ ├── vendors.test.js # Vendor route tests
│ ├── fares.test.js # Fare route tests
│ ├── orders.test.js # Order route tests
│ ├── warehouses.test.js # Warehouse route tests
│ └── shipments.test.js # Shipment route tests
├── utils/
│ └── testHelpers.js # Test utility functions
├── setup.js # Jest setup configuration
└── setupTestDb.js # Test database setup script
The tests use a separate PostgreSQL database (logistics_test_db) to ensure:
- Data isolation from development database
- Clean state for each test
- No interference with development data
- Parallel test execution capability
- ✅ User registration (valid/invalid data)
- ✅ User login (valid/invalid credentials)
- ✅ Profile retrieval (authenticated/unauthenticated)
- ✅ Role-based access control
- ✅ Input validation
- ✅ Error handling
- ✅ Get all vendors (with pagination and filtering)
- ✅ Get vendor by ID
- ✅ Create vendor (role-based access)
- ✅ Update vendor (role-based access)
- ✅ Delete vendor (role-based access)
- ✅ Get vendors by city
- ✅ Search functionality
- ✅ Input validation
- ✅ Error handling
- ✅ Get all fares (with pagination and filtering)
- ✅ Get fare by ID
- ✅ Create fare (role-based access)
- ✅ Update fare (role-based access)
- ✅ Delete fare (role-based access)
- ✅ Get fare by route
- ✅ Duplicate route prevention
- ✅ Input validation
- ✅ Error handling
- ✅ Get all orders (with pagination and filtering)
- ✅ Get order by ID
- ✅ Create order (with fare calculation)
- ✅ Update order (role-based access)
- ✅ Delete order (role-based access)
- ✅ Different delivery types
- ✅ Fare calculation logic
- ✅ Input validation
- ✅ Error handling
- ✅ Get all warehouses (with pagination and filtering)
- ✅ Get warehouse by ID
- ✅ Create warehouse (role-based access)
- ✅ Update warehouse (role-based access)
- ✅ Delete warehouse (role-based access)
- ✅ Get warehouses by city
- ✅ Search functionality
- ✅ Input validation
- ✅ Error handling
- ✅ Get all shipments (with pagination and filtering)
- ✅ Get shipment by ID
- ✅ Get shipment by tracking number
- ✅ Create shipment (role-based access)
- ✅ Update shipment (role-based access)
- ✅ Delete shipment (role-based access)
- ✅ Status transitions
- ✅ Input validation
- ✅ Error handling
- PostgreSQL Database: Ensure PostgreSQL is running on port 5433
- Test Database: The test database will be created automatically
- Dependencies: All test dependencies are installed
# Setup test database (run once)
npm run test:setup
# Run all tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage report
npm run test:coverage
# Run tests for CI/CD
npm run test:ci# Run specific test file
npm test -- auth.test.js
# Run tests matching pattern
npm test -- --testNamePattern="should create user"
# Run tests in specific directory
npm test -- routes/- Test Environment: Node.js
- Setup Files:
src/tests/setup.js - Test Match:
**/src/tests/**/*.test.js - Coverage: Excludes test files and setup scripts
- Timeout: 30 seconds per test
- Verbose: Detailed output
- Host: localhost
- Port: 5433
- Database: logistics_test_db
- User: postgres
- Password: (none required)
Provides utility methods for creating test data:
// Create test users
await TestHelpers.createTestUser(userData);
await TestHelpers.createTestAdmin(userData);
await TestHelpers.createTestManager(userData);
// Create test entities
await TestHelpers.createTestVendor(vendorData);
await TestHelpers.createTestFare(fareData);
await TestHelpers.createTestWarehouse(warehouseData);
await TestHelpers.createTestOrder(orderData);
await TestHelpers.createTestShipment(shipmentData);
// Generate auth tokens
const token = TestHelpers.generateAuthToken(user);
// Get auth headers
const headers = TestHelpers.getAuthHeaders(token);- Before Each Test: Database is cleaned to ensure test isolation
- After All Tests: Database is cleaned and connection closed
- Cleanup Order: Dependencies are deleted in reverse order
- Each test creates its own data
- No shared state between tests
- Clean database state for each test
- Parallel test execution support
The test suite provides comprehensive coverage reports:
# Generate coverage report
npm run test:coverage
# View HTML coverage report
open coverage/lcov-report/index.html- Statements: > 90%
- Branches: > 85%
- Functions: > 90%
- Lines: > 90%
name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:13
env:
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '18'
- run: npm ci
- run: npm run test:ci- One test file per route group
- Descriptive test names
- Arrange-Act-Assert pattern
- Independent test cases
- Use TestHelpers for consistent data creation
- Clean up after each test
- Use meaningful test data
- Avoid hardcoded values
- Test both success and error cases
- Verify error messages and status codes
- Test input validation
- Test authorization and authentication
- Use database transactions for faster cleanup
- Parallel test execution
- Efficient test data creation
- Minimal test setup/teardown
-
Database Connection Errors
- Ensure PostgreSQL is running
- Check database credentials
- Verify test database exists
-
Test Timeout Errors
- Increase Jest timeout
- Check for hanging database connections
- Verify test cleanup
-
Port Already in Use
- Kill existing processes on test port
- Use different port for tests
- Check for running test processes
-
Test Data Conflicts
- Ensure proper database cleanup
- Check for unique constraint violations
- Verify test isolation
# Run tests with debug output
DEBUG=* npm test
# Run specific test with debug
DEBUG=* npm test -- --testNamePattern="should create user"When adding new tests:
- Follow existing test patterns
- Use TestHelpers for data creation
- Test both success and error cases
- Include proper cleanup
- Add meaningful test descriptions
- Update this documentation