execute method

  1. @override
Future<void> execute({
  1. required CancelToken cancelToken,
  2. required TestReport report,
  3. required TestController tester,
})
override

Executes the step. This will first look for the Testable, get the error from the Testable, then compare it against the set error value.

Implementation

@override
Future<void> execute({
  required CancelToken cancelToken,
  required TestReport report,
  required TestController tester,
}) async {
  final error = tester.resolveVariable(this.error);
  final testableId = tester.resolveVariable(this.testableId);
  assert(testableId?.isNotEmpty == true);

  final name = "$id('$testableId', '$error', '$equals', '$caseSensitive')";
  log(
    name,
    tester: tester,
  );
  final finder = await waitFor(
    testableId,
    cancelToken: cancelToken,
    tester: tester,
    timeout: timeout,
  );

  await sleep(
    tester.delays.postFoundWidget,
    cancelStream: cancelToken.stream,
    tester: tester,
  );

  if (cancelToken.cancelled == true) {
    throw Exception('[CANCELLED]: step was cancelled by the test');
  }
  final widgetFinder = finder.evaluate();
  var match = false;
  if (widgetFinder.isNotEmpty == true) {
    final element = widgetFinder.first as StatefulElement;

    final state = element.state;
    if (state is TestableState) {
      try {
        final actual = state.onRequestError!();

        if (equals ==
            (caseSensitive == true
                ? (actual?.toString() == error)
                : (actual?.toString().toLowerCase() ==
                    error?.toString().toLowerCase()))) {
          match = true;
        } else {
          throw Exception(
            'testableId: [$testableId] -- actualValue: [$actual] ${equals == true ? '!=' : '=='} [$error] (caseSensitive = [$caseSensitive]).',
          );
        }
      } catch (e) {
        // no-op; fail via "match != true"
      }
    }
  }
  if (match != true) {
    throw Exception(
      'testableId: [$testableId] -- could not locate Testable with a functional [onRequestError] method.',
    );
  }
}