## What was done: ✅ Fixed Firebase Admin initialization to use default credentials for Firebase Functions ✅ Updated frontend to use correct Firebase Functions URL (was using Cloud Run URL) ✅ Added comprehensive debugging to authentication middleware ✅ Added debugging to file upload middleware and CORS handling ✅ Added debug buttons to frontend for troubleshooting authentication ✅ Enhanced error handling and logging throughout the stack ## Current issues: ❌ Document upload still returns 400 Bad Request despite authentication working ❌ GET requests work fine (200 OK) but POST upload requests fail ❌ Frontend authentication is working correctly (valid JWT tokens) ❌ Backend authentication middleware is working (rejects invalid tokens) ❌ CORS is configured correctly and allowing requests ## Root cause analysis: - Authentication is NOT the issue (tokens are valid, GET requests work) - The problem appears to be in the file upload handling or multer configuration - Request reaches the server but fails during upload processing - Need to identify exactly where in the upload pipeline the failure occurs ## TODO next steps: 1. 🔍 Check Firebase Functions logs after next upload attempt to see debugging output 2. 🔍 Verify if request reaches upload middleware (look for '�� Upload middleware called' logs) 3. 🔍 Check if file validation is triggered (look for '🔍 File filter called' logs) 4. 🔍 Identify specific error in upload pipeline (multer, file processing, etc.) 5. 🔍 Test with smaller file or different file type to isolate issue 6. 🔍 Check if issue is with Firebase Functions file size limits or timeout 7. 🔍 Verify multer configuration and file handling in Firebase Functions environment ## Technical details: - Frontend: https://cim-summarizer.web.app - Backend: https://us-central1-cim-summarizer.cloudfunctions.net/api - Authentication: Firebase Auth with JWT tokens (working correctly) - File upload: Multer with memory storage for immediate GCS upload - Debug buttons available in production frontend for troubleshooting
68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import { config } from '../../config/env';
|
|
import { fileStorageService } from '../../services/fileStorageService';
|
|
|
|
// Mock environment variables
|
|
const originalEnv = process.env;
|
|
|
|
describe('Deployment Configuration Tests', () => {
|
|
beforeEach(() => {
|
|
jest.resetModules();
|
|
process.env = { ...originalEnv };
|
|
});
|
|
|
|
afterAll(() => {
|
|
process.env = originalEnv;
|
|
});
|
|
|
|
describe('Environment Configuration', () => {
|
|
it('should have required GCS configuration', () => {
|
|
expect(config.googleCloud).toBeDefined();
|
|
expect(config.googleCloud.gcsBucketName).toBeDefined();
|
|
expect(config.googleCloud.projectId).toBeDefined();
|
|
expect(config.googleCloud.applicationCredentials).toBeDefined();
|
|
});
|
|
|
|
it('should not have local storage configuration', () => {
|
|
// Verify no local storage paths are configured
|
|
expect(config.upload?.uploadDir).toContain('/tmp/');
|
|
expect(config.upload?.maxFileSize).toBeDefined();
|
|
});
|
|
|
|
it('should have proper database configuration', () => {
|
|
expect(config.supabase).toBeDefined();
|
|
expect(config.supabase.url).toBeDefined();
|
|
});
|
|
|
|
it('should have proper authentication configuration', () => {
|
|
expect(config.jwt).toBeDefined();
|
|
expect(config.jwt.secret).toBeDefined();
|
|
});
|
|
});
|
|
|
|
describe('GCS Service Configuration', () => {
|
|
it('should initialize GCS service with proper configuration', async () => {
|
|
const testConnection = await fileStorageService.testConnection();
|
|
expect(typeof testConnection).toBe('boolean');
|
|
});
|
|
|
|
it('should have proper bucket configuration', () => {
|
|
expect(config.googleCloud.gcsBucketName).toMatch(/^[a-z0-9-]+$/);
|
|
expect(config.googleCloud.projectId).toMatch(/^[a-z0-9-]+$/);
|
|
});
|
|
});
|
|
|
|
describe('Cloud-Only Architecture Validation', () => {
|
|
it('should not reference local file system paths', () => {
|
|
// This test ensures no local file system operations are configured
|
|
const configString = JSON.stringify(config);
|
|
expect(configString).not.toContain('/uploads/');
|
|
expect(configString).not.toContain('localPath');
|
|
});
|
|
|
|
it('should have cloud service configurations', () => {
|
|
expect(config.googleCloud).toBeDefined();
|
|
expect(config.supabase).toBeDefined();
|
|
expect(config.redis).toBeDefined();
|
|
});
|
|
});
|
|
});
|