feat(dependencies): add rxdart package and improve string extension methods for better handling of empty strings and gender parsing

This commit is contained in:
mso7nueh
2025-12-04 15:45:54 +03:00
parent 0cd8e662d9
commit 953230b387
100 changed files with 7202 additions and 14 deletions

View File

@@ -0,0 +1,125 @@
import 'package:eatvio_app/core/utils/pagination_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
class TestScrollNotification extends ScrollNotification {
final ScrollMetrics _metrics;
TestScrollNotification(this._metrics) : super(
metrics: _metrics,
context: null,
);
@override
ScrollMetrics get metrics => _metrics;
}
class TestScrollMetrics extends FixedScrollMetrics {
@override
final bool outOfRange;
TestScrollMetrics({
required super.minScrollExtent,
required super.maxScrollExtent,
required super.pixels,
required super.viewportDimension,
required super.axisDirection,
required super.devicePixelRatio,
required this.outOfRange,
});
}
void main() {
group('PaginationUtils', () {
test('loadNewContent - вызывает load когда достигнут порог', () {
bool loadCalled = false;
final metrics = FixedScrollMetrics(
minScrollExtent: 0.0,
maxScrollExtent: 1000.0,
pixels: 850.0, // 1000 - 150 = 850 (порог)
viewportDimension: 100.0,
axisDirection: AxisDirection.down,
devicePixelRatio: 1.0,
);
final notification = TestScrollNotification(metrics);
loadNewContent(notification, () {
loadCalled = true;
return Future.value();
});
expect(loadCalled, isTrue);
});
test('loadNewContent - не вызывает load когда не достигнут порог', () {
bool loadCalled = false;
final metrics = FixedScrollMetrics(
minScrollExtent: 0.0,
maxScrollExtent: 1000.0,
pixels: 700.0, // меньше порога
viewportDimension: 100.0,
axisDirection: AxisDirection.down,
devicePixelRatio: 1.0,
);
final notification = TestScrollNotification(metrics);
loadNewContent(notification, () {
loadCalled = true;
return Future.value();
});
expect(loadCalled, isFalse);
});
test('loadNewContent - не вызывает load когда outOfRange', () {
bool loadCalled = false;
// Создаем метрики с outOfRange = true
final metrics = TestScrollMetrics(
minScrollExtent: 0.0,
maxScrollExtent: 1000.0,
pixels: 850.0, // на пороге, но outOfRange = true
viewportDimension: 100.0,
axisDirection: AxisDirection.down,
devicePixelRatio: 1.0,
outOfRange: true,
);
final notification = TestScrollNotification(metrics);
loadNewContent(notification, () {
loadCalled = true;
return Future.value();
});
expect(loadCalled, isFalse);
});
test('loadNewContent - вызывает load точно на пороге', () {
bool loadCalled = false;
final metrics = FixedScrollMetrics(
minScrollExtent: 0.0,
maxScrollExtent: 1000.0,
pixels: 850.0, // точно на пороге (1000 - 150)
viewportDimension: 100.0,
axisDirection: AxisDirection.down,
devicePixelRatio: 1.0,
);
final notification = TestScrollNotification(metrics);
loadNewContent(notification, () {
loadCalled = true;
return Future.value();
});
expect(loadCalled, isTrue);
});
});
}

View File

@@ -0,0 +1,43 @@
import 'package:eatvio_app/core/utils/string_extentions.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('String Capitalization Extension', () {
test('capitalize - делает первую букву заглавной, остальные строчными', () {
expect('hello'.capitalize(), 'Hello');
expect('WORLD'.capitalize(), 'World');
expect('tEsT'.capitalize(), 'Test');
expect('a'.capitalize(), 'A');
});
test('capitalize - работает с пустой строкой', () {
expect(''.capitalize(), '');
});
test('capitalize - работает с одной буквой', () {
expect('h'.capitalize(), 'H');
expect('H'.capitalize(), 'H');
});
test('parseGender - преобразует "male" в "Мужской"', () {
expect('male'.parseGender(), 'Мужской');
});
test('parseGender - преобразует "female" в "Женский"', () {
expect('female'.parseGender(), 'Женский');
});
test('parseGender - возвращает исходную строку для других значений', () {
expect('other'.parseGender(), 'other');
expect('unknown'.parseGender(), 'unknown');
expect(''.parseGender(), '');
});
test('parseGender - регистрозависимый', () {
expect('Male'.parseGender(), 'Male');
expect('FEMALE'.parseGender(), 'FEMALE');
expect('Male'.parseGender(), isNot('Мужской'));
});
});
}