/** * Sample Migration Test Script * * This script tests the migration functionality with sample localStorage data * to verify that the migration foundation is working correctly. */ import { MigrationService } from './src/MigrationService.js'; import { AuthService } from './src/AuthService.js'; import { AppWriteManager } from './src/AppWriteManager.js'; import { APPWRITE_CONFIG } from './src/AppWriteConfig.js'; // Mock localStorage for Node.js environment const mockLocalStorage = { data: new Map(), getItem(key) { return this.data.get(key) || null; }, setItem(key, value) { this.data.set(key, value); }, removeItem(key) { this.data.delete(key); }, clear() { this.data.clear(); } }; // Setup global mocks for Node.js global.localStorage = mockLocalStorage; global.btoa = (str) => Buffer.from(str).toString('base64'); global.atob = (str) => Buffer.from(str, 'base64').toString(); // Mock AppWrite Manager for testing class MockAppWriteManager { constructor() { this.documents = new Map(); this.isAuthenticated = true; this.currentUserId = 'test-user-123'; } getCurrentUserId() { return this.currentUserId; } async createUserDocument(collectionId, data, documentId = null) { const id = documentId || `doc_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; const document = { $id: id, $createdAt: new Date().toISOString(), $updatedAt: new Date().toISOString(), userId: this.currentUserId, ...data }; if (!this.documents.has(collectionId)) { this.documents.set(collectionId, []); } this.documents.get(collectionId).push(document); console.log(`āœ… Created document in ${collectionId}:`, document); return document; } async getUserDocuments(collectionId, additionalQueries = []) { const docs = this.documents.get(collectionId) || []; const userDocs = docs.filter(doc => doc.userId === this.currentUserId); console.log(`šŸ“‹ Retrieved ${userDocs.length} documents from ${collectionId}`); return { documents: userDocs, total: userDocs.length }; } clearAllDocuments() { this.documents.clear(); } } async function runMigrationTest() { console.log('šŸš€ Starting Migration Sample Test\n'); try { // Initialize services console.log('1ļøāƒ£ Initializing services...'); const mockAppWriteManager = new MockAppWriteManager(); const migrationService = new MigrationService(mockAppWriteManager); console.log('āœ… Services initialized\n'); // Setup sample localStorage data console.log('2ļøāƒ£ Setting up sample localStorage data...'); // Enhanced Items const enhancedItems = [ { id: 'sample-item-1', amazonUrl: 'https://amazon.de/dp/sample-item-1', originalTitle: 'Sample Product 1', customTitle: 'AI Enhanced Sample Product 1', price: '29.99', currency: 'EUR', titleSuggestions: ['Enhanced Title 1', 'Better Title 1', 'AI Title 1'], createdAt: new Date().toISOString() }, { id: 'sample-item-2', amazonUrl: 'https://amazon.de/dp/sample-item-2', originalTitle: 'Sample Product 2', customTitle: 'AI Enhanced Sample Product 2', price: '49.99', currency: 'EUR', titleSuggestions: ['Enhanced Title 2', 'Better Title 2', 'AI Title 2'], createdAt: new Date().toISOString() } ]; // Blacklisted Brands const blacklistedBrands = [ { id: 'sample-brand-1', name: 'Sample Brand 1', addedAt: new Date().toISOString() }, { id: 'sample-brand-2', name: 'Sample Brand 2', addedAt: new Date().toISOString() } ]; // Settings const settings = { mistralApiKey: 'sample-api-key-12345', autoExtractEnabled: false, defaultTitleSelection: 'original', maxRetries: 5, timeoutSeconds: 15, updatedAt: new Date().toISOString() }; // Store in mock localStorage mockLocalStorage.setItem('amazon-ext-enhanced-items', JSON.stringify(enhancedItems)); mockLocalStorage.setItem('amazon_ext_blacklist', JSON.stringify(blacklistedBrands)); mockLocalStorage.setItem('amazon-ext-enhanced-settings', JSON.stringify(settings)); console.log(`āœ… Created ${enhancedItems.length} enhanced items`); console.log(`āœ… Created ${blacklistedBrands.length} blacklisted brands`); console.log('āœ… Created custom settings'); console.log(''); // Test data detection console.log('3ļøāƒ£ Testing data detection...'); const detection = await migrationService.detectExistingData(); console.log('šŸ“Š Detection Results:'); console.log(` Has Data: ${detection.hasData}`); console.log(` Total Items: ${detection.totalItems}`); console.log(` Data Types: ${Object.keys(detection.dataTypes).join(', ')}`); if (detection.hasData) { console.log('āœ… Data detection successful\n'); } else { console.log('āŒ Data detection failed\n'); return false; } // Test migration console.log('4ļøāƒ£ Testing migration...'); const migrationResult = await migrationService.migrateAllData(); if (migrationResult.success) { console.log('āœ… Migration completed successfully!'); console.log('šŸ“Š Migration Results:'); if (migrationResult.results) { Object.entries(migrationResult.results).forEach(([type, result]) => { if (result.migrated > 0 || result.skipped > 0 || result.errors.length > 0) { console.log(` ${type}:`); console.log(` Migrated: ${result.migrated}`); console.log(` Skipped: ${result.skipped}`); console.log(` Errors: ${result.errors.length}`); } }); } console.log(''); } else { console.log('āŒ Migration failed:', migrationResult.error); return false; } // Verify migration status console.log('5ļøāƒ£ Verifying migration status...'); const status = await migrationService.getMigrationStatus(); console.log('šŸ“‹ Migration Status:'); console.log(` Completed: ${status.completed}`); console.log(` Total Migrated: ${status.totalMigrated || 0}`); console.log(` Total Errors: ${status.totalErrors || 0}`); if (status.completed) { console.log('āœ… Migration status verification successful\n'); } else { console.log('āŒ Migration status verification failed\n'); return false; } // Verify data in AppWrite console.log('6ļøāƒ£ Verifying data in AppWrite...'); const enhancedItemsData = await mockAppWriteManager.getUserDocuments('amazon-ext-enhanced-items'); const blacklistData = await mockAppWriteManager.getUserDocuments('amazon_ext_blacklist'); const settingsData = await mockAppWriteManager.getUserDocuments('amazon-ext-enhanced-settings'); console.log('šŸ“‹ AppWrite Data Verification:'); console.log(` Enhanced Items: ${enhancedItemsData.total} documents`); console.log(` Blacklisted Brands: ${blacklistData.total} documents`); console.log(` Settings: ${settingsData.total} documents`); const expectedItems = enhancedItems.length; const expectedBrands = blacklistedBrands.length; const expectedSettings = 1; if (enhancedItemsData.total === expectedItems && blacklistData.total === expectedBrands && settingsData.total === expectedSettings) { console.log('āœ… Data verification successful\n'); } else { console.log('āŒ Data verification failed - counts do not match\n'); return false; } console.log('šŸŽ‰ All migration tests passed successfully!'); console.log('āœ… Authentication and Migration Foundation is working correctly'); return true; } catch (error) { console.error('āŒ Migration test failed:', error); console.error('Stack trace:', error.stack); return false; } } // Run the test runMigrationTest().then(success => { if (success) { console.log('\nšŸ† CHECKPOINT PASSED: Authentication and Migration Foundation is ready!'); process.exit(0); } else { console.log('\nšŸ’„ CHECKPOINT FAILED: Issues found with Authentication and Migration Foundation'); process.exit(1); } }).catch(error => { console.error('\nšŸ’„ CHECKPOINT ERROR:', error); process.exit(1); });