Files
kooltab/test/product_grid_test.dart

73 lines
2.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:kooltap/l10n/app_localizations.dart';
import 'package:kooltap/models/product.dart';
import 'package:kooltap/views/bar/product_grid.dart';
import 'package:kooltap/views/widgets/product_tile.dart';
final _products = [
for (var i = 0; i < 60; i++)
Product(
id: 'prod-$i',
name: 'Product $i',
category: 'Drinks',
stockQuantity: 10,
lowStockThreshold: 2,
priceInCents: 300,
),
];
void main() {
Future<void> pumpGrid(WidgetTester tester, int rows, Size size) async {
tester.view.physicalSize = size;
tester.view.devicePixelRatio = 1;
addTearDown(tester.view.reset);
await tester.pumpWidget(
MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: Scaffold(
body: ProductGrid(
products: _products,
rows: rows,
hasSelectedTab: true,
onProductTap: (_) {},
),
),
),
);
}
for (final size in [const Size(853, 720), const Size(1280, 1000)]) {
for (var rows = 2; rows <= 6; rows++) {
testWidgets('shows exactly $rows rows at $size', (tester) async {
await pumpGrid(tester, rows, size);
final grid = tester.getRect(find.byType(GridView));
final tiles = tester
.widgetList(find.byType(ProductTile))
.map((tile) => tester.getRect(find.byWidget(tile)))
.toList();
final fullyVisibleRows = {
for (final tile in tiles)
if (tile.top >= grid.top && tile.bottom <= grid.bottom + 0.5)
tile.top.round(),
};
expect(fullyVisibleRows, hasLength(rows));
final lastRowBottom = tiles
.where((tile) => tile.bottom <= grid.bottom + 0.5)
.map((tile) => tile.bottom)
.reduce((a, b) => a > b ? a : b);
expect(
grid.bottom - lastRowBottom,
closeTo(16, 1),
reason: 'the rows fill the height down to the bottom padding',
);
});
}
}
}