Initial (redacted) commit.

This commit is contained in:
mustard 2024-08-26 00:34:20 +02:00
commit 655f8a036a
368 changed files with 20949 additions and 0 deletions

View file

@ -0,0 +1,74 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:ri_go_demo/main.dart';
import 'package:ri_go_demo/src/features/rest_crud_demo/data/people_repository.dart';
import 'package:ri_go_demo/src/utils/logger.dart';
import 'fake_repository.dart';
// see https://raw.githubusercontent.com/flutter/codelabs/main/namer/step_08/test/a11y_test.dart
void main() {
testWidgets('Follows a11y guidelines for start screen',
(WidgetTester tester) async {
logger.d('test with provider, as they are');
final SemanticsHandle handle = tester.ensureSemantics();
await tester.pumpWidget(const ProviderScope(child: MyApp()));
await _testA11y(tester);
handle.dispose();
});
testWidgets('Click edit person and check a11y guidelines',
(WidgetTester tester) async {
logger.d('test with fakeRepository');
final SemanticsHandle handle = tester.ensureSemantics();
await tester.pumpWidget(
ProviderScope(
overrides: [
peopleRepositoryProvider.overrideWithValue(FakeRepository()),
],
child: const MyApp(),
),
);
// The first frame is a loading state.
expect(find.byType(CircularProgressIndicator), findsOneWidget);
// Re-render.
await tester.pump();
// No longer loading
expect(find.byType(CircularProgressIndicator), findsNothing);
final editIconButtonFinder = find.byIcon(Icons.edit);
// repository holds 2 items, hence expect 2 edit icons
expect(editIconButtonFinder, findsNWidgets(2));
await tester.press(editIconButtonFinder.first);
await tester.pump();
//test form widget for a11y
await _testA11y(tester);
handle.dispose();
});
}
Future<void> _testA11y(WidgetTester tester) async {
// Checks that tappable nodes have a minimum size of 48 by 48 pixels
// for Android.
await expectLater(tester, meetsGuideline(androidTapTargetGuideline));
// Checks that tappable nodes have a minimum size of 44 by 44 pixels
// for iOS.
await expectLater(tester, meetsGuideline(iOSTapTargetGuideline));
// Checks that touch targets with a tap or long press action are labeled.
await expectLater(tester, meetsGuideline(labeledTapTargetGuideline));
// Checks whether semantic nodes meet the minimum text contrast levels.
// The recommended text contrast is 3:1 for larger text
// (18 point and above regular).
await expectLater(tester, meetsGuideline(textContrastGuideline));
// @see https://github.com/rrousselGit/riverpod/issues/1941
await tester.pumpWidget(Container());
await tester.pumpAndSettle();
}

View file

@ -0,0 +1,261 @@
import 'package:dio/dio.dart';
import 'package:ri_go_demo/src/features/rest_crud_demo/data/people_repository.dart';
import 'package:ri_go_demo/src/features/rest_crud_demo/domain/person.dart';
import 'package:ri_go_demo/src/utils/logger.dart';
/// A mocked implementation of Repository
/// @see https://riverpod.dev/docs/cookbooks/testing
class FakeRepository implements PeopleRepository {
@override
Future<bool> deletePerson(int id) {
return Future.value(true);
}
@override
Dio get dio => throw UnimplementedError(); //FakeDio();
@override
Future<List<Person>> getPeople() {
logger.d('fake_repository.fetchPeople');
final people = <Person>[
const Person(id: 1, name: 'Eva', imageUrl: ''),
const Person(id: 2, name: 'Lotta', imageUrl: ''),
];
return Future.value(people);
}
@override
Future<Person> getPersonById({required int id}) {
throw UnimplementedError();
}
@override
Future<Person> savePerson({required Person person}) {
throw UnimplementedError();
}
@override
Future<Person> updatePerson({required Person person}) {
throw UnimplementedError();
}
}
class FakeDio implements Dio {
@override
HttpClientAdapter httpClientAdapter = HttpClientAdapter();
@override
BaseOptions options = BaseOptions();
@override
Transformer transformer = BackgroundTransformer();
@override
void close({bool force = false}) {}
@override
Future<Response<T>> delete<T>(
String path, {
Object? data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> deleteUri<T>(
Uri uri, {
Object? data,
Options? options,
CancelToken? cancelToken,
}) {
throw UnimplementedError();
}
@override
// ignore: strict_raw_type, type_annotate_public_apis
Future<Response> download(
String urlPath,
// ignore: type_annotate_public_apis
savePath, {
ProgressCallback? onReceiveProgress,
Map<String, dynamic>? queryParameters,
CancelToken? cancelToken,
bool deleteOnError = true,
String lengthHeader = Headers.contentLengthHeader,
Object? data,
Options? options,
}) {
throw UnimplementedError();
}
@override
// ignore: strict_raw_type, type_annotate_public_apis
Future<Response> downloadUri(
Uri uri,
// ignore: type_annotate_public_apis
savePath, {
ProgressCallback? onReceiveProgress,
CancelToken? cancelToken,
bool deleteOnError = true,
String lengthHeader = Headers.contentLengthHeader,
Object? data,
Options? options,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> fetch<T>(RequestOptions requestOptions) {
throw UnimplementedError();
}
@override
Future<Response<T>> get<T>(
String path, {
Object? data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onReceiveProgress,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> getUri<T>(
Uri uri, {
Object? data,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onReceiveProgress,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> head<T>(
String path, {
Object? data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> headUri<T>(
Uri uri, {
Object? data,
Options? options,
CancelToken? cancelToken,
}) {
throw UnimplementedError();
}
@override
Interceptors get interceptors => throw UnimplementedError();
@override
Future<Response<T>> patch<T>(
String path, {
Object? data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> patchUri<T>(
Uri uri, {
Object? data,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> post<T>(
String path, {
Object? data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> postUri<T>(
Uri uri, {
Object? data,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> put<T>(
String path, {
Object? data,
Map<String, dynamic>? queryParameters,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> putUri<T>(
Uri uri, {
Object? data,
Options? options,
CancelToken? cancelToken,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> request<T>(
String url, {
Object? data,
Map<String, dynamic>? queryParameters,
CancelToken? cancelToken,
Options? options,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
}) {
throw UnimplementedError();
}
@override
Future<Response<T>> requestUri<T>(
Uri uri, {
Object? data,
CancelToken? cancelToken,
Options? options,
ProgressCallback? onSendProgress,
ProgressCallback? onReceiveProgress,
}) {
throw UnimplementedError();
}
}