Files
ReelShort/test/store/store_pages_test.dart
T

106 lines
3.1 KiB
Dart

// Author: fruit.com.cn
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:fruitshorts/core/data/models/order.dart';
import 'package:fruitshorts/core/data/models/product.dart';
import 'package:fruitshorts/core/data/repositories/store_repository.dart';
import 'package:fruitshorts/l10n/app_localizations.dart';
import 'package:fruitshorts/pages/store/recharge_page.dart';
import 'package:fruitshorts/pages/store/vip_page.dart';
void main() {
testWidgets('should_show_coin_packs_and_create_order_when_buying', (
tester,
) async {
final repository = _FakeStoreRepository();
await tester.pumpWidget(_app(RechargePage(repository: repository)));
await tester.pumpAndSettle();
expect(find.text('550 Coins'), findsOneWidget);
expect(find.textContaining('500 coins'), findsOneWidget);
expect(find.textContaining('+50 bonus'), findsOneWidget);
expect(find.text('Rp 15.000'), findsOneWidget);
await tester.tap(find.byKey(const Key('store-buy-pack-1')));
await tester.pumpAndSettle();
expect(repository.requestedTypes, ['COIN_PACK']);
expect(repository.orderedProductIds, ['pack-1']);
expect(find.textContaining('Order ORD1 created.'), findsOneWidget);
});
testWidgets('should_show_vip_tiers_and_create_order_when_joining', (
tester,
) async {
final repository = _FakeStoreRepository();
await tester.pumpWidget(_app(VipPage(repository: repository)));
await tester.pumpAndSettle();
expect(find.text('30-day VIP'), findsOneWidget);
expect(find.text('Rp 99.000'), findsOneWidget);
await tester.tap(find.byKey(const Key('store-buy-vip-1')));
await tester.pumpAndSettle();
expect(repository.requestedTypes, ['VIP']);
expect(repository.orderedProductIds, ['vip-1']);
expect(find.textContaining('Order ORD1 created.'), findsOneWidget);
});
}
Widget _app(Widget home) => MaterialApp(
locale: const Locale('en'),
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: home,
);
class _FakeStoreRepository implements StoreRepository {
final List<String?> requestedTypes = [];
final List<String> orderedProductIds = [];
@override
Future<List<AppProduct>> fetchProducts({String? type}) async {
requestedTypes.add(type);
if (type == AppProduct.vipType) {
return const [
AppProduct(
id: 'vip-1',
code: 'vip_30',
name: 'Monthly VIP',
type: AppProduct.vipType,
displayPrice: 'Rp 99.000',
vipDays: 30,
),
];
}
return const [
AppProduct(
id: 'pack-1',
code: 'coin_550',
name: '550 Coins',
type: AppProduct.coinPackType,
coinAmount: 500,
bonusCoin: 50,
totalCoin: 550,
displayPrice: 'Rp 15.000',
),
];
}
@override
Future<AppOrder> createOrder(String productId) async {
orderedProductIds.add(productId);
return const AppOrder(
id: 'order-1',
orderNo: 'ORD1',
productName: 'Coin pack',
coinAmount: 550,
status: AppOrder.created,
);
}
}