496 lines
12 KiB
Markdown
496 lines
12 KiB
Markdown
# Manual Test Instructions for CSV Rate System
|
||
|
||
## Prerequisites
|
||
|
||
Before running tests, ensure you have:
|
||
|
||
1. ✅ PostgreSQL running (port 5432)
|
||
2. ✅ Redis running (port 6379)
|
||
3. ✅ Backend API started (port 4000)
|
||
4. ✅ A user account with credentials
|
||
5. ✅ An admin account (optional, for admin tests)
|
||
|
||
## Step 1: Start Infrastructure
|
||
|
||
```bash
|
||
cd /Users/david/Documents/xpeditis/dev/xpeditis2.0
|
||
|
||
# Start PostgreSQL and Redis
|
||
docker-compose up -d
|
||
|
||
# Verify services are running
|
||
docker ps
|
||
```
|
||
|
||
Expected output should show `postgres` and `redis` containers running.
|
||
|
||
## Step 2: Run Database Migration
|
||
|
||
```bash
|
||
cd apps/backend
|
||
|
||
# Run migrations to create csv_rate_configs table
|
||
npm run migration:run
|
||
```
|
||
|
||
This will:
|
||
- Create `csv_rate_configs` table
|
||
- Seed 5 companies: SSC Consolidation, ECU Worldwide, TCC Logistics, NVO Consolidation, **Test Maritime Express**
|
||
|
||
## Step 3: Start Backend API
|
||
|
||
```bash
|
||
cd apps/backend
|
||
|
||
# Start development server
|
||
npm run dev
|
||
```
|
||
|
||
Expected output:
|
||
```
|
||
[Nest] INFO [NestFactory] Starting Nest application...
|
||
[Nest] INFO [InstanceLoader] AppModule dependencies initialized
|
||
[Nest] INFO Application is running on: http://localhost:4000
|
||
```
|
||
|
||
Keep this terminal open and running.
|
||
|
||
## Step 4: Get JWT Token
|
||
|
||
Open a new terminal and run:
|
||
|
||
```bash
|
||
# Login to get JWT token
|
||
curl -X POST http://localhost:4000/api/v1/auth/login \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"email": "test4@xpeditis.com",
|
||
"password": "SecurePassword123"
|
||
}'
|
||
```
|
||
|
||
**Copy the `accessToken` from the response** and save it for later tests.
|
||
|
||
Example response:
|
||
```json
|
||
{
|
||
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
|
||
"user": {
|
||
"id": "...",
|
||
"email": "test4@xpeditis.com"
|
||
}
|
||
}
|
||
```
|
||
|
||
## Step 5: Test Public Endpoints
|
||
|
||
### Test 1: Get Available Companies
|
||
|
||
```bash
|
||
curl -X GET http://localhost:4000/api/v1/rates/companies \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE"
|
||
```
|
||
|
||
**Expected Result:**
|
||
```json
|
||
{
|
||
"companies": [
|
||
"SSC Consolidation",
|
||
"ECU Worldwide",
|
||
"TCC Logistics",
|
||
"NVO Consolidation",
|
||
"Test Maritime Express"
|
||
],
|
||
"total": 5
|
||
}
|
||
```
|
||
|
||
✅ **Verify:** You should see 5 companies including "Test Maritime Express"
|
||
|
||
### Test 2: Get Filter Options
|
||
|
||
```bash
|
||
curl -X GET http://localhost:4000/api/v1/rates/filters/options \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE"
|
||
```
|
||
|
||
**Expected Result:**
|
||
```json
|
||
{
|
||
"companies": ["SSC Consolidation", "ECU Worldwide", "TCC Logistics", "NVO Consolidation", "Test Maritime Express"],
|
||
"containerTypes": ["LCL"],
|
||
"currencies": ["USD", "EUR"]
|
||
}
|
||
```
|
||
|
||
### Test 3: Basic Rate Search (NLRTM → USNYC)
|
||
|
||
```bash
|
||
curl -X POST http://localhost:4000/api/v1/rates/search-csv \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
||
-d '{
|
||
"origin": "NLRTM",
|
||
"destination": "USNYC",
|
||
"volumeCBM": 25.5,
|
||
"weightKG": 3500,
|
||
"palletCount": 10,
|
||
"containerType": "LCL"
|
||
}'
|
||
```
|
||
|
||
**Expected Result:**
|
||
- Multiple results from different companies
|
||
- Total price calculated based on max(volume × pricePerCBM, weight × pricePerKG)
|
||
- Match scores (0-100%) indicating relevance
|
||
|
||
**Example response:**
|
||
```json
|
||
{
|
||
"results": [
|
||
{
|
||
"companyName": "Test Maritime Express",
|
||
"origin": "NLRTM",
|
||
"destination": "USNYC",
|
||
"totalPrice": {
|
||
"amount": 950.00,
|
||
"currency": "USD"
|
||
},
|
||
"transitDays": 22,
|
||
"matchScore": 95,
|
||
"hasSurcharges": false
|
||
},
|
||
{
|
||
"companyName": "SSC Consolidation",
|
||
"origin": "NLRTM",
|
||
"destination": "USNYC",
|
||
"totalPrice": {
|
||
"amount": 1100.00,
|
||
"currency": "USD"
|
||
},
|
||
"transitDays": 22,
|
||
"matchScore": 92,
|
||
"hasSurcharges": true
|
||
}
|
||
// ... more results
|
||
],
|
||
"totalResults": 15,
|
||
"matchedCompanies": 5
|
||
}
|
||
```
|
||
|
||
✅ **Verify:**
|
||
1. Results from multiple companies appear
|
||
2. Test Maritime Express has lower price than others (~$950 vs ~$1100+)
|
||
3. Match scores are calculated
|
||
4. Both "all-in" (no surcharges) and surcharged rates appear
|
||
|
||
### Test 4: Filter by Company
|
||
|
||
```bash
|
||
curl -X POST http://localhost:4000/api/v1/rates/search-csv \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
||
-d '{
|
||
"origin": "NLRTM",
|
||
"destination": "USNYC",
|
||
"volumeCBM": 25.5,
|
||
"weightKG": 3500,
|
||
"palletCount": 10,
|
||
"containerType": "LCL",
|
||
"filters": {
|
||
"companies": ["Test Maritime Express"]
|
||
}
|
||
}'
|
||
```
|
||
|
||
✅ **Verify:** Only Test Maritime Express results appear
|
||
|
||
### Test 5: Filter by Price Range
|
||
|
||
```bash
|
||
curl -X POST http://localhost:4000/api/v1/rates/search-csv \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
||
-d '{
|
||
"origin": "NLRTM",
|
||
"destination": "USNYC",
|
||
"volumeCBM": 25.5,
|
||
"weightKG": 3500,
|
||
"palletCount": 10,
|
||
"containerType": "LCL",
|
||
"filters": {
|
||
"minPrice": 900,
|
||
"maxPrice": 1200,
|
||
"currency": "USD"
|
||
}
|
||
}'
|
||
```
|
||
|
||
✅ **Verify:** All results have price between $900-$1200
|
||
|
||
### Test 6: Filter by Transit Days
|
||
|
||
```bash
|
||
curl -X POST http://localhost:4000/api/v1/rates/search-csv \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
||
-d '{
|
||
"origin": "NLRTM",
|
||
"destination": "USNYC",
|
||
"volumeCBM": 25.5,
|
||
"weightKG": 3500,
|
||
"containerType": "LCL",
|
||
"filters": {
|
||
"maxTransitDays": 23
|
||
}
|
||
}'
|
||
```
|
||
|
||
✅ **Verify:** All results have transit ≤ 23 days
|
||
|
||
### Test 7: Filter by Surcharges (All-in Prices Only)
|
||
|
||
```bash
|
||
curl -X POST http://localhost:4000/api/v1/rates/search-csv \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
||
-d '{
|
||
"origin": "NLRTM",
|
||
"destination": "USNYC",
|
||
"volumeCBM": 25.5,
|
||
"weightKG": 3500,
|
||
"containerType": "LCL",
|
||
"filters": {
|
||
"withoutSurcharges": true
|
||
}
|
||
}'
|
||
```
|
||
|
||
✅ **Verify:** All results have `hasSurcharges: false`
|
||
|
||
## Step 6: Comparator Verification Test
|
||
|
||
This is the **MAIN TEST** to verify multiple companies appear with different prices.
|
||
|
||
```bash
|
||
curl -X POST http://localhost:4000/api/v1/rates/search-csv \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
||
-d '{
|
||
"origin": "NLRTM",
|
||
"destination": "USNYC",
|
||
"volumeCBM": 25,
|
||
"weightKG": 3500,
|
||
"palletCount": 10,
|
||
"containerType": "LCL"
|
||
}' | jq '.results[] | {company: .companyName, price: .totalPrice.amount, transit: .transitDays, match: .matchScore}'
|
||
```
|
||
|
||
**Expected Output (sorted by price):**
|
||
|
||
```json
|
||
{
|
||
"company": "Test Maritime Express",
|
||
"price": 950.00,
|
||
"transit": 22,
|
||
"match": 95
|
||
}
|
||
{
|
||
"company": "SSC Consolidation",
|
||
"price": 1100.00,
|
||
"transit": 22,
|
||
"match": 92
|
||
}
|
||
{
|
||
"company": "TCC Logistics",
|
||
"price": 1120.00,
|
||
"transit": 22,
|
||
"match": 90
|
||
}
|
||
{
|
||
"company": "NVO Consolidation",
|
||
"price": 1130.00,
|
||
"transit": 22,
|
||
"match": 88
|
||
}
|
||
{
|
||
"company": "ECU Worldwide",
|
||
"price": 1150.00,
|
||
"transit": 23,
|
||
"match": 86
|
||
}
|
||
```
|
||
|
||
### ✅ Verification Checklist
|
||
|
||
- [ ] All 5 companies appear in results
|
||
- [ ] Test Maritime Express has lowest price (~$950)
|
||
- [ ] Other companies have higher prices (~$1100-$1200)
|
||
- [ ] Price difference is clearly visible (10-20% cheaper)
|
||
- [ ] Each company has different pricing
|
||
- [ ] Match scores are calculated
|
||
- [ ] Transit days are displayed
|
||
- [ ] Comparator shows multiple offers correctly ✓
|
||
|
||
## Step 7: Alternative Routes Test
|
||
|
||
Test other routes to verify CSV data is loaded:
|
||
|
||
### DEHAM → USNYC
|
||
|
||
```bash
|
||
curl -X POST http://localhost:4000/api/v1/rates/search-csv \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
||
-d '{
|
||
"origin": "DEHAM",
|
||
"destination": "USNYC",
|
||
"volumeCBM": 30,
|
||
"weightKG": 4000,
|
||
"containerType": "LCL"
|
||
}'
|
||
```
|
||
|
||
### FRLEH → CNSHG
|
||
|
||
```bash
|
||
curl -X POST http://localhost:4000/api/v1/rates/search-csv \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
|
||
-d '{
|
||
"origin": "FRLEH",
|
||
"destination": "CNSHG",
|
||
"volumeCBM": 50,
|
||
"weightKG": 8000,
|
||
"containerType": "LCL"
|
||
}'
|
||
```
|
||
|
||
## Step 8: Admin Endpoints (Optional)
|
||
|
||
**Note:** These endpoints require ADMIN role.
|
||
|
||
### Get All CSV Configurations
|
||
|
||
```bash
|
||
curl -X GET http://localhost:4000/api/v1/admin/csv-rates/config \
|
||
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
||
```
|
||
|
||
### Validate CSV File
|
||
|
||
```bash
|
||
curl -X POST http://localhost:4000/api/v1/admin/csv-rates/validate/Test%20Maritime%20Express \
|
||
-H "Authorization: Bearer YOUR_ADMIN_TOKEN"
|
||
```
|
||
|
||
### Upload New CSV File
|
||
|
||
```bash
|
||
curl -X POST http://localhost:4000/api/v1/admin/csv-rates/upload \
|
||
-H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
|
||
-F "file=@/Users/david/Documents/xpeditis/dev/xpeditis2.0/apps/backend/src/infrastructure/storage/csv-storage/rates/test-maritime-express.csv" \
|
||
-F "companyName=Test Maritime Express Updated" \
|
||
-F "fileDescription=Updated fictional carrier rates"
|
||
```
|
||
|
||
## Alternative: Use Automated Test Scripts
|
||
|
||
Instead of manual curl commands, you can use the automated test scripts:
|
||
|
||
### Option 1: Bash Script
|
||
|
||
```bash
|
||
cd apps/backend
|
||
chmod +x test-csv-api.sh
|
||
./test-csv-api.sh
|
||
```
|
||
|
||
### Option 2: Node.js Script
|
||
|
||
```bash
|
||
cd apps/backend
|
||
node test-csv-api.js
|
||
```
|
||
|
||
Both scripts will:
|
||
1. Authenticate automatically
|
||
2. Run all 9 test scenarios
|
||
3. Display results with color-coded output
|
||
4. Verify comparator functionality
|
||
|
||
## Troubleshooting
|
||
|
||
### Error: "Cannot connect to database"
|
||
|
||
```bash
|
||
# Check PostgreSQL is running
|
||
docker ps | grep postgres
|
||
|
||
# Restart PostgreSQL
|
||
docker-compose restart postgres
|
||
```
|
||
|
||
### Error: "Unauthorized"
|
||
|
||
- Verify JWT token is valid (tokens expire after 15 minutes)
|
||
- Get a new token using the login endpoint
|
||
- Ensure token is correctly copied (no extra spaces)
|
||
|
||
### Error: "CSV file not found"
|
||
|
||
- Verify CSV files exist in `apps/backend/src/infrastructure/storage/csv-storage/rates/`
|
||
- Check migration was run successfully
|
||
- Verify `csv_rate_configs` table has 5 records
|
||
|
||
### No Results in Search
|
||
|
||
- Check that origin/destination match CSV data (e.g., NLRTM, USNYC)
|
||
- Verify containerType is "LCL"
|
||
- Check volume/weight ranges are within CSV limits
|
||
- Try without filters first
|
||
|
||
### Test Maritime Express Not Appearing
|
||
|
||
- Run migration again: `npm run migration:run`
|
||
- Check database: `SELECT company_name FROM csv_rate_configs;`
|
||
- Verify CSV file exists: `ls src/infrastructure/storage/csv-storage/rates/test-maritime-express.csv`
|
||
|
||
## Expected Results Summary
|
||
|
||
| Test | Expected Result | Verification |
|
||
|------|----------------|--------------|
|
||
| Get Companies | 5 companies including Test Maritime Express | ✓ Count = 5 |
|
||
| Filter Options | Companies, container types, currencies | ✓ Data returned |
|
||
| Basic Search | Multiple results from different companies | ✓ Multiple companies |
|
||
| Company Filter | Only filtered company appears | ✓ Filter works |
|
||
| Price Filter | All results in price range | ✓ Range correct |
|
||
| Transit Filter | All results ≤ max transit days | ✓ Range correct |
|
||
| Surcharge Filter | Only all-in rates | ✓ No surcharges |
|
||
| Comparator | All 5 companies with different prices | ✓ Test Maritime Express cheapest |
|
||
| Alternative Routes | Results for DEHAM, FRLEH routes | ✓ CSV data loaded |
|
||
|
||
## Success Criteria
|
||
|
||
The CSV rate system is working correctly if:
|
||
|
||
1. ✅ All 5 companies are available
|
||
2. ✅ Search returns results from multiple companies simultaneously
|
||
3. ✅ Test Maritime Express appears with lower prices (10-20% cheaper)
|
||
4. ✅ All filters work correctly (company, price, transit, surcharges)
|
||
5. ✅ Match scores are calculated (0-100%)
|
||
6. ✅ Total price includes freight + surcharges
|
||
7. ✅ Comparator shows clear price differences between companies
|
||
8. ✅ Results can be sorted by different criteria
|
||
|
||
## Next Steps After Testing
|
||
|
||
Once all tests pass:
|
||
|
||
1. **Frontend Integration**: Test the Next.js frontend at http://localhost:3000/rates/csv-search
|
||
2. **Admin Interface**: Test CSV upload at http://localhost:3000/admin/csv-rates
|
||
3. **Performance**: Run load tests with k6
|
||
4. **Documentation**: Update API documentation
|
||
5. **Deployment**: Deploy to staging environment
|