Initial (redacted) commit.
This commit is contained in:
commit
655f8a036a
368 changed files with 20949 additions and 0 deletions
74
learning/demo-app/test/a11y_test.dart
Normal file
74
learning/demo-app/test/a11y_test.dart
Normal 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();
|
||||
}
|
261
learning/demo-app/test/fake_repository.dart
Normal file
261
learning/demo-app/test/fake_repository.dart
Normal 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();
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue