// Test script for waitlist API // Run with: node test-waitlist.js // Make sure .env file exists with your credentials require('dotenv').config(); const { google } = require('googleapis'); async function testWaitlist() { console.log('๐Ÿงช Testing Google Sheets Waitlist Integration...\n'); // Check environment variables const credentials = process.env.GOOGLE_SERVICE_ACCOUNT; const spreadsheetId = process.env.GOOGLE_SHEET_ID; const sheetName = process.env.GOOGLE_SHEET_NAME || 'Waitlist'; console.log('๐Ÿ“‹ Configuration Check:'); console.log(' โœ“ GOOGLE_SERVICE_ACCOUNT:', credentials ? `Set (${credentials.length} chars)` : 'โŒ MISSING'); console.log(' โœ“ GOOGLE_SHEET_ID:', spreadsheetId || 'โŒ MISSING'); console.log(' โœ“ GOOGLE_SHEET_NAME:', sheetName); console.log(''); if (!credentials || !spreadsheetId) { console.error('โŒ Missing required environment variables!'); console.error(' Create a .env file with GOOGLE_SERVICE_ACCOUNT and GOOGLE_SHEET_ID'); process.exit(1); } try { // Parse credentials console.log('๐Ÿ” Parsing credentials...'); const credentialsTrimmed = credentials.trim(); let serviceAccount; try { serviceAccount = JSON.parse(credentialsTrimmed); console.log(' โœ“ Credentials parsed successfully'); console.log(' โœ“ Service account email:', serviceAccount.client_email); } catch (parseError) { console.error(' โŒ Failed to parse credentials:', parseError.message); process.exit(1); } // Authenticate console.log('\n๐Ÿ”‘ Authenticating with Google...'); const auth = new google.auth.GoogleAuth({ credentials: serviceAccount, scopes: ['https://www.googleapis.com/auth/spreadsheets'], }); console.log(' โœ“ Authentication successful'); // Get sheets client const sheets = google.sheets({ version: 'v4', auth }); // Test 1: Get spreadsheet metadata console.log('\n๐Ÿ“Š Test 1: Checking spreadsheet access...'); try { const spreadsheet = await sheets.spreadsheets.get({ spreadsheetId, }); console.log(' โœ“ Spreadsheet found:', spreadsheet.data.properties.title); console.log(' โœ“ Spreadsheet ID:', spreadsheetId); } catch (error) { console.error(' โŒ Cannot access spreadsheet:', error.message); if (error.code === 403) { console.error(' โ†’ Permission denied. Make sure the service account email has Editor access to the sheet.'); console.error(' โ†’ Service account email:', serviceAccount.client_email); } else if (error.code === 404) { console.error(' โ†’ Spreadsheet not found. Check the GOOGLE_SHEET_ID.'); } process.exit(1); } // Test 2: Check if sheet tab exists console.log('\n๐Ÿ“‘ Test 2: Checking sheet tab...'); try { const spreadsheet = await sheets.spreadsheets.get({ spreadsheetId, }); const sheetTabs = spreadsheet.data.sheets.map(s => s.properties.title); console.log(' โœ“ Available sheet tabs:', sheetTabs.join(', ')); if (!sheetTabs.includes(sheetName)) { console.error(` โŒ Sheet tab "${sheetName}" not found!`); console.error(' โ†’ Available tabs:', sheetTabs.join(', ')); console.error(' โ†’ Update GOOGLE_SHEET_NAME or create a tab named "' + sheetName + '"'); process.exit(1); } console.log(` โœ“ Sheet tab "${sheetName}" exists`); } catch (error) { console.error(' โŒ Error checking sheet tabs:', error.message); process.exit(1); } // Test 3: Try to read from the sheet console.log('\n๐Ÿ“– Test 3: Reading from sheet...'); try { const response = await sheets.spreadsheets.values.get({ spreadsheetId, range: `${sheetName}!A1:C10`, }); console.log(' โœ“ Can read from sheet'); if (response.data.values) { console.log(' โœ“ Current rows:', response.data.values.length); } } catch (error) { console.error(' โŒ Cannot read from sheet:', error.message); process.exit(1); } // Test 4: Try to append a test row console.log('\nโœ๏ธ Test 4: Testing write access...'); try { const testTimestamp = new Date().toISOString(); const testEmail = 'test@example.com'; const testName = 'Test User'; const values = [[testTimestamp, testEmail, testName]]; await sheets.spreadsheets.values.append({ spreadsheetId, range: `${sheetName}!A:C`, valueInputOption: 'USER_ENTERED', insertDataOption: 'INSERT_ROWS', resource: { values, }, }); console.log(' โœ“ Successfully wrote test row to sheet'); console.log(' โœ“ Check your Google Sheet - you should see a test entry'); } catch (error) { console.error(' โŒ Cannot write to sheet:', error.message); if (error.response?.status === 403) { console.error(' โ†’ Permission denied. Service account needs Editor access.'); } process.exit(1); } console.log('\nโœ… All tests passed! Your configuration is correct.'); console.log('\n๐Ÿ’ก Next steps:'); console.log(' 1. Make sure these same values are set in Vercel environment variables'); console.log(' 2. Deploy to Vercel'); console.log(' 3. Test the form on your live site'); } catch (error) { console.error('\nโŒ Unexpected error:', error.message); console.error(' Stack:', error.stack); process.exit(1); } } testWaitlist();