import 'package:flutter_test/flutter_test.dart'; import 'package:motorcycle_dash/services/billing/billing_models.dart'; import 'package:motorcycle_dash/services/billing/durable_verification_queue.dart'; import 'package:motorcycle_dash/services/billing/product_catalog.dart'; void main() { group('InMemoryVerificationQueue', () { test('enqueues, dequeues, and records backoff properly', () async { final queue = InMemoryVerificationQueue(); expect(await queue.loadQueue(), isEmpty); const purchase = StorePurchase( purchaseId: 'order_1', productId: ProductCatalog.proMonthly, status: StorePurchaseStatus.purchased, transactionDate: '2026-09-01T12:00:00Z', purchaseToken: 'raw_token_secret_123', purchaseTokenHash: 'hash_123', ); await queue.enqueue(purchase); var items = await queue.loadQueue(); expect(items.length, 1); expect(items.first.purchaseId, 'order_1'); expect(items.first.productId, ProductCatalog.proMonthly); expect(items.first.purchaseToken, 'raw_token_secret_123'); expect(items.first.attemptCount, 0); // Duplicate enqueue is idempotent await queue.enqueue(purchase); items = await queue.loadQueue(); expect(items.length, 1); // Record retry await queue.recordRetry( 'order_1', backoffDelay: const Duration(seconds: 30), ); items = await queue.loadQueue(); expect(items.first.attemptCount, 1); expect(items.first.nextRetryAt.isAfter(items.first.queuedAt), isTrue); // Dequeue await queue.dequeue('order_1'); items = await queue.loadQueue(); expect(items, isEmpty); }); test('ignores purchase with null or empty token', () async { final queue = InMemoryVerificationQueue(); const purchase = StorePurchase( purchaseId: 'order_2', productId: ProductCatalog.proLifetime, status: StorePurchaseStatus.purchased, transactionDate: '2026-09-01T12:00:00Z', purchaseToken: null, ); await queue.enqueue(purchase); expect(await queue.loadQueue(), isEmpty); }); }); }