// Mocks generated by Mockito 5.4.4 from annotations
// in cocoon_service/test/src/utilities/mocks.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i21;
import 'dart:convert' as _i27;
import 'dart:io' as _i26;
import 'dart:typed_data' as _i40;

import 'package:appengine/appengine.dart' as _i11;
import 'package:buildbucket/buildbucket_pb.dart' as _i9;
import 'package:cocoon_service/cocoon_service.dart' as _i16;
import 'package:cocoon_service/src/foundation/github_checks_util.dart' as _i25;
import 'package:cocoon_service/src/model/appengine/branch.dart' as _i35;
import 'package:cocoon_service/src/model/appengine/commit.dart' as _i36;
import 'package:cocoon_service/src/model/appengine/github_build_status_update.dart' as _i19;
import 'package:cocoon_service/src/model/appengine/github_gold_status_update.dart' as _i20;
import 'package:cocoon_service/src/model/appengine/key_helper.dart' as _i13;
import 'package:cocoon_service/src/model/appengine/stage.dart' as _i38;
import 'package:cocoon_service/src/model/appengine/task.dart' as _i37;
import 'package:cocoon_service/src/model/ci_yaml/target.dart' as _i47;
import 'package:cocoon_service/src/model/firestore/commit.dart' as _i41;
import 'package:cocoon_service/src/model/firestore/github_build_status.dart' as _i24;
import 'package:cocoon_service/src/model/firestore/github_gold_status.dart' as _i23;
import 'package:cocoon_service/src/model/firestore/task.dart' as _i42;
import 'package:cocoon_service/src/model/github/checks.dart' as _i48;
import 'package:cocoon_service/src/model/luci/buildbucket.dart' as _i8;
import 'package:cocoon_service/src/model/luci/push_message.dart' as _i43;
import 'package:cocoon_service/src/service/access_client_provider.dart' as _i5;
import 'package:cocoon_service/src/service/access_token_provider.dart' as _i30;
import 'package:cocoon_service/src/service/bigquery.dart' as _i17;
import 'package:cocoon_service/src/service/build_bucket_v2_client.dart' as _i28;
import 'package:cocoon_service/src/service/commit_service.dart' as _i33;
import 'package:cocoon_service/src/service/config.dart' as _i3;
import 'package:cocoon_service/src/service/datastore.dart' as _i10;
import 'package:cocoon_service/src/service/gerrit_service.dart' as _i7;
import 'package:cocoon_service/src/service/github_checks_service_v2.dart' as _i44;
import 'package:cocoon_service/src/service/github_service.dart' as _i18;
import 'package:cocoon_service/src/service/luci_build_service_v2.dart' as _i46;
import 'package:cocoon_service/src/service/scheduler_v2.dart' as _i45;
import 'package:fixnum/fixnum.dart' as _i49;
import 'package:gcloud/db.dart' as _i12;
import 'package:github/github.dart' as _i14;
import 'package:github/hooks.dart' as _i34;
import 'package:googleapis/bigquery/v2.dart' as _i6;
import 'package:googleapis/firestore/v1.dart' as _i22;
import 'package:googleapis_auth/auth_io.dart' as _i4;
import 'package:graphql/client.dart' as _i15;
import 'package:http/http.dart' as _i2;
import 'package:mockito/mockito.dart' as _i1;
import 'package:mockito/src/dummies.dart' as _i32;
import 'package:neat_cache/neat_cache.dart' as _i29;
import 'package:process/src/interface/process_manager.dart' as _i50;
import 'package:retry/retry.dart' as _i31;

import '../../service/cache_service_test.dart' as _i39;
import 'mocks.dart' as _i51;

// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: deprecated_member_use
// ignore_for_file: deprecated_member_use_from_same_package
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class

class _FakeClient_0 extends _i1.SmartFake implements _i2.Client {
  _FakeClient_0(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeConfig_1 extends _i1.SmartFake implements _i3.Config {
  _FakeConfig_1(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeAccessToken_2 extends _i1.SmartFake implements _i4.AccessToken {
  _FakeAccessToken_2(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeAccessClientProvider_3 extends _i1.SmartFake implements _i5.AccessClientProvider {
  _FakeAccessClientProvider_3(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeTabledataResource_4 extends _i1.SmartFake implements _i6.TabledataResource {
  _FakeTabledataResource_4(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeJobsResource_5 extends _i1.SmartFake implements _i6.JobsResource {
  _FakeJobsResource_5(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGerritService_6 extends _i1.SmartFake implements _i7.GerritService {
  _FakeGerritService_6(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeBuild_7 extends _i1.SmartFake implements _i8.Build {
  _FakeBuild_7(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeSearchBuildsResponse_8 extends _i1.SmartFake implements _i8.SearchBuildsResponse {
  _FakeSearchBuildsResponse_8(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeBatchResponse_9 extends _i1.SmartFake implements _i8.BatchResponse {
  _FakeBatchResponse_9(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeListBuildersResponse_10 extends _i1.SmartFake implements _i8.ListBuildersResponse {
  _FakeListBuildersResponse_10(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeBuild_11 extends _i1.SmartFake implements _i9.Build {
  _FakeBuild_11(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeSearchBuildsResponse_12 extends _i1.SmartFake implements _i9.SearchBuildsResponse {
  _FakeSearchBuildsResponse_12(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeBatchResponse_13 extends _i1.SmartFake implements _i9.BatchResponse {
  _FakeBatchResponse_13(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeListBuildersResponse_14 extends _i1.SmartFake implements _i9.ListBuildersResponse {
  _FakeListBuildersResponse_14(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeDatastoreService_15 extends _i1.SmartFake implements _i10.DatastoreService {
  _FakeDatastoreService_15(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeLogging_16 extends _i1.SmartFake implements _i11.Logging {
  _FakeLogging_16(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeDatastoreDB_17 extends _i1.SmartFake implements _i12.DatastoreDB {
  _FakeDatastoreDB_17(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeKeyHelper_18 extends _i1.SmartFake implements _i13.KeyHelper {
  _FakeKeyHelper_18(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeDuration_19 extends _i1.SmartFake implements Duration {
  _FakeDuration_19(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitHub_20 extends _i1.SmartFake implements _i14.GitHub {
  _FakeGitHub_20(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGraphQLClient_21 extends _i1.SmartFake implements _i15.GraphQLClient {
  _FakeGraphQLClient_21(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeFirestoreService_22 extends _i1.SmartFake implements _i16.FirestoreService {
  _FakeFirestoreService_22(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeBigqueryService_23 extends _i1.SmartFake implements _i17.BigqueryService {
  _FakeBigqueryService_23(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGithubService_24 extends _i1.SmartFake implements _i18.GithubService {
  _FakeGithubService_24(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGithubBuildStatusUpdate_25 extends _i1.SmartFake implements _i19.GithubBuildStatusUpdate {
  _FakeGithubBuildStatusUpdate_25(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGithubGoldStatusUpdate_26 extends _i1.SmartFake implements _i20.GithubGoldStatusUpdate {
  _FakeGithubGoldStatusUpdate_26(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeFuture_27<T1> extends _i1.SmartFake implements _i21.Future<T1> {
  _FakeFuture_27(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeProjectsDatabasesDocumentsResource_28 extends _i1.SmartFake
    implements _i22.ProjectsDatabasesDocumentsResource {
  _FakeProjectsDatabasesDocumentsResource_28(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeDocument_29 extends _i1.SmartFake implements _i22.Document {
  _FakeDocument_29(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeBatchWriteResponse_30 extends _i1.SmartFake implements _i22.BatchWriteResponse {
  _FakeBatchWriteResponse_30(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCommitResponse_31 extends _i1.SmartFake implements _i22.CommitResponse {
  _FakeCommitResponse_31(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGithubGoldStatus_32 extends _i1.SmartFake implements _i23.GithubGoldStatus {
  _FakeGithubGoldStatus_32(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGithubBuildStatus_33 extends _i1.SmartFake implements _i24.GithubBuildStatus {
  _FakeGithubBuildStatus_33(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeValue_34 extends _i1.SmartFake implements _i22.Value {
  _FakeValue_34(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeFilter_35 extends _i1.SmartFake implements _i22.Filter {
  _FakeFilter_35(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeIssue_36 extends _i1.SmartFake implements _i14.Issue {
  _FakeIssue_36(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeIssueComment_37 extends _i1.SmartFake implements _i14.IssueComment {
  _FakeIssueComment_37(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeIssueLabel_38 extends _i1.SmartFake implements _i14.IssueLabel {
  _FakeIssueLabel_38(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeMilestone_39 extends _i1.SmartFake implements _i14.Milestone {
  _FakeMilestone_39(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGithubChecksUtil_40 extends _i1.SmartFake implements _i25.GithubChecksUtil {
  _FakeGithubChecksUtil_40(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCheckRunConclusion_41 extends _i1.SmartFake implements _i14.CheckRunConclusion {
  _FakeCheckRunConclusion_41(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCheckRunStatus_42 extends _i1.SmartFake implements _i14.CheckRunStatus {
  _FakeCheckRunStatus_42(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCheckSuite_43 extends _i1.SmartFake implements _i14.CheckSuite {
  _FakeCheckSuite_43(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCheckRun_44 extends _i1.SmartFake implements _i14.CheckRun {
  _FakeCheckRun_44(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePullRequest_45 extends _i1.SmartFake implements _i14.PullRequest {
  _FakePullRequest_45(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitReference_46 extends _i1.SmartFake implements _i14.GitReference {
  _FakeGitReference_46(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRateLimit_47 extends _i1.SmartFake implements _i14.RateLimit {
  _FakeRateLimit_47(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitBlob_48 extends _i1.SmartFake implements _i14.GitBlob {
  _FakeGitBlob_48(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitCommit_49 extends _i1.SmartFake implements _i14.GitCommit {
  _FakeGitCommit_49(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitTag_50 extends _i1.SmartFake implements _i14.GitTag {
  _FakeGitTag_50(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitTree_51 extends _i1.SmartFake implements _i14.GitTree {
  _FakeGitTree_51(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeDefaultPolicies_52 extends _i1.SmartFake implements _i15.DefaultPolicies {
  _FakeDefaultPolicies_52(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeLink_53 extends _i1.SmartFake implements _i15.Link {
  _FakeLink_53(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGraphQLCache_54 extends _i1.SmartFake implements _i15.GraphQLCache {
  _FakeGraphQLCache_54(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeQueryManager_55 extends _i1.SmartFake implements _i15.QueryManager {
  _FakeQueryManager_55(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeObservableQuery_56<TParsed1> extends _i1.SmartFake implements _i15.ObservableQuery<TParsed1> {
  _FakeObservableQuery_56(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeQueryResult_57<TParsed1 extends Object?> extends _i1.SmartFake implements _i15.QueryResult<TParsed1> {
  _FakeQueryResult_57(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeHttpClientRequest_58 extends _i1.SmartFake implements _i26.HttpClientRequest {
  _FakeHttpClientRequest_58(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeUri_59 extends _i1.SmartFake implements Uri {
  _FakeUri_59(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeHttpHeaders_60 extends _i1.SmartFake implements _i26.HttpHeaders {
  _FakeHttpHeaders_60(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeHttpClientResponse_61 extends _i1.SmartFake implements _i26.HttpClientResponse {
  _FakeHttpClientResponse_61(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeEncoding_62 extends _i1.SmartFake implements _i27.Encoding {
  _FakeEncoding_62(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeSocket_63 extends _i1.SmartFake implements _i26.Socket {
  _FakeSocket_63(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeStreamSubscription_64<T> extends _i1.SmartFake implements _i21.StreamSubscription<T> {
  _FakeStreamSubscription_64(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeJobCancelResponse_65 extends _i1.SmartFake implements _i6.JobCancelResponse {
  _FakeJobCancelResponse_65(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeJob_66 extends _i1.SmartFake implements _i6.Job {
  _FakeJob_66(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGetQueryResultsResponse_67 extends _i1.SmartFake implements _i6.GetQueryResultsResponse {
  _FakeGetQueryResultsResponse_67(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeJobList_68 extends _i1.SmartFake implements _i6.JobList {
  _FakeJobList_68(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeQueryResponse_69 extends _i1.SmartFake implements _i6.QueryResponse {
  _FakeQueryResponse_69(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeBuildBucketClient_70 extends _i1.SmartFake implements _i16.BuildBucketClient {
  _FakeBuildBucketClient_70(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeBuildBucketV2Client_71 extends _i1.SmartFake implements _i28.BuildBucketV2Client {
  _FakeBuildBucketV2Client_71(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCacheService_72 extends _i1.SmartFake implements _i16.CacheService {
  _FakeCacheService_72(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePubSub_73 extends _i1.SmartFake implements _i16.PubSub {
  _FakePubSub_73(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeProcess_74 extends _i1.SmartFake implements _i26.Process {
  _FakeProcess_74(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePullRequestMerge_75 extends _i1.SmartFake implements _i14.PullRequestMerge {
  _FakePullRequestMerge_75(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePullRequestComment_76 extends _i1.SmartFake implements _i14.PullRequestComment {
  _FakePullRequestComment_76(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePullRequestReview_77 extends _i1.SmartFake implements _i14.PullRequestReview {
  _FakePullRequestReview_77(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepository_78 extends _i1.SmartFake implements _i14.Repository {
  _FakeRepository_78(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeLicenseDetails_79 extends _i1.SmartFake implements _i14.LicenseDetails {
  _FakeLicenseDetails_79(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeLanguageBreakdown_80 extends _i1.SmartFake implements _i14.LanguageBreakdown {
  _FakeLanguageBreakdown_80(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeBranch_81 extends _i1.SmartFake implements _i14.Branch {
  _FakeBranch_81(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCommitComment_82 extends _i1.SmartFake implements _i14.CommitComment {
  _FakeCommitComment_82(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepositoryCommit_83 extends _i1.SmartFake implements _i14.RepositoryCommit {
  _FakeRepositoryCommit_83(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitHubComparison_84 extends _i1.SmartFake implements _i14.GitHubComparison {
  _FakeGitHubComparison_84(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitHubFile_85 extends _i1.SmartFake implements _i14.GitHubFile {
  _FakeGitHubFile_85(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepositoryContents_86 extends _i1.SmartFake implements _i14.RepositoryContents {
  _FakeRepositoryContents_86(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeContentCreation_87 extends _i1.SmartFake implements _i14.ContentCreation {
  _FakeContentCreation_87(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeHook_88 extends _i1.SmartFake implements _i14.Hook {
  _FakeHook_88(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePublicKey_89 extends _i1.SmartFake implements _i14.PublicKey {
  _FakePublicKey_89(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepositoryPages_90 extends _i1.SmartFake implements _i14.RepositoryPages {
  _FakeRepositoryPages_90(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePageBuild_91 extends _i1.SmartFake implements _i14.PageBuild {
  _FakePageBuild_91(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRelease_92 extends _i1.SmartFake implements _i14.Release {
  _FakeRelease_92(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeReleaseAsset_93 extends _i1.SmartFake implements _i14.ReleaseAsset {
  _FakeReleaseAsset_93(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeContributorParticipation_94 extends _i1.SmartFake implements _i14.ContributorParticipation {
  _FakeContributorParticipation_94(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepositoryStatus_95 extends _i1.SmartFake implements _i14.RepositoryStatus {
  _FakeRepositoryStatus_95(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCombinedRepositoryStatus_96 extends _i1.SmartFake implements _i14.CombinedRepositoryStatus {
  _FakeCombinedRepositoryStatus_96(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeReleaseNotes_97 extends _i1.SmartFake implements _i14.ReleaseNotes {
  _FakeReleaseNotes_97(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeTableDataInsertAllResponse_98 extends _i1.SmartFake implements _i6.TableDataInsertAllResponse {
  _FakeTableDataInsertAllResponse_98(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeTableDataList_99 extends _i1.SmartFake implements _i6.TableDataList {
  _FakeTableDataList_99(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeUser_100 extends _i1.SmartFake implements _i14.User {
  _FakeUser_100(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCurrentUser_101 extends _i1.SmartFake implements _i14.CurrentUser {
  _FakeCurrentUser_101(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeEntry_102<T> extends _i1.SmartFake implements _i29.Entry<T> {
  _FakeEntry_102(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCache_103<T> extends _i1.SmartFake implements _i29.Cache<T> {
  _FakeCache_103(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeAuthentication_104 extends _i1.SmartFake implements _i14.Authentication {
  _FakeAuthentication_104(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeActivityService_105 extends _i1.SmartFake implements _i14.ActivityService {
  _FakeActivityService_105(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeAuthorizationsService_106 extends _i1.SmartFake implements _i14.AuthorizationsService {
  _FakeAuthorizationsService_106(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGistsService_107 extends _i1.SmartFake implements _i14.GistsService {
  _FakeGistsService_107(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeGitService_108 extends _i1.SmartFake implements _i14.GitService {
  _FakeGitService_108(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeIssuesService_109 extends _i1.SmartFake implements _i14.IssuesService {
  _FakeIssuesService_109(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeMiscService_110 extends _i1.SmartFake implements _i14.MiscService {
  _FakeMiscService_110(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeOrganizationsService_111 extends _i1.SmartFake implements _i14.OrganizationsService {
  _FakeOrganizationsService_111(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePullRequestsService_112 extends _i1.SmartFake implements _i14.PullRequestsService {
  _FakePullRequestsService_112(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRepositoriesService_113 extends _i1.SmartFake implements _i14.RepositoriesService {
  _FakeRepositoriesService_113(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeSearchService_114 extends _i1.SmartFake implements _i14.SearchService {
  _FakeSearchService_114(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeUrlShortenerService_115 extends _i1.SmartFake implements _i14.UrlShortenerService {
  _FakeUrlShortenerService_115(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeUsersService_116 extends _i1.SmartFake implements _i14.UsersService {
  _FakeUsersService_116(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeChecksService_117 extends _i1.SmartFake implements _i14.ChecksService {
  _FakeChecksService_117(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeResponse_118 extends _i1.SmartFake implements _i2.Response {
  _FakeResponse_118(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

/// A class which mocks [AccessClientProvider].
///
/// See the documentation for Mockito's code generation for more information.
class MockAccessClientProvider extends _i1.Mock implements _i5.AccessClientProvider {
  MockAccessClientProvider() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i21.Future<_i2.Client> createAccessClient({
    List<String>? scopes = const [r'https://www.googleapis.com/auth/cloud-platform'],
    _i2.Client? baseClient,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createAccessClient,
          [],
          {
            #scopes: scopes,
            #baseClient: baseClient,
          },
        ),
        returnValue: _i21.Future<_i2.Client>.value(_FakeClient_0(
          this,
          Invocation.method(
            #createAccessClient,
            [],
            {
              #scopes: scopes,
              #baseClient: baseClient,
            },
          ),
        )),
      ) as _i21.Future<_i2.Client>);
}

/// A class which mocks [AccessTokenService].
///
/// See the documentation for Mockito's code generation for more information.
class MockAccessTokenService extends _i1.Mock implements _i30.AccessTokenService {
  MockAccessTokenService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i3.Config get config => (super.noSuchMethod(
        Invocation.getter(#config),
        returnValue: _FakeConfig_1(
          this,
          Invocation.getter(#config),
        ),
      ) as _i3.Config);

  @override
  _i21.Future<_i4.AccessToken> createAccessToken() => (super.noSuchMethod(
        Invocation.method(
          #createAccessToken,
          [],
        ),
        returnValue: _i21.Future<_i4.AccessToken>.value(_FakeAccessToken_2(
          this,
          Invocation.method(
            #createAccessToken,
            [],
          ),
        )),
      ) as _i21.Future<_i4.AccessToken>);
}

/// A class which mocks [BigqueryService].
///
/// See the documentation for Mockito's code generation for more information.
class MockBigqueryService extends _i1.Mock implements _i17.BigqueryService {
  MockBigqueryService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i5.AccessClientProvider get accessClientProvider => (super.noSuchMethod(
        Invocation.getter(#accessClientProvider),
        returnValue: _FakeAccessClientProvider_3(
          this,
          Invocation.getter(#accessClientProvider),
        ),
      ) as _i5.AccessClientProvider);

  @override
  _i21.Future<_i6.TabledataResource> defaultTabledata() => (super.noSuchMethod(
        Invocation.method(
          #defaultTabledata,
          [],
        ),
        returnValue: _i21.Future<_i6.TabledataResource>.value(_FakeTabledataResource_4(
          this,
          Invocation.method(
            #defaultTabledata,
            [],
          ),
        )),
      ) as _i21.Future<_i6.TabledataResource>);

  @override
  _i21.Future<_i6.JobsResource> defaultJobs() => (super.noSuchMethod(
        Invocation.method(
          #defaultJobs,
          [],
        ),
        returnValue: _i21.Future<_i6.JobsResource>.value(_FakeJobsResource_5(
          this,
          Invocation.method(
            #defaultJobs,
            [],
          ),
        )),
      ) as _i21.Future<_i6.JobsResource>);

  @override
  _i21.Future<List<_i17.BuilderStatistic>> listBuilderStatistic(
    String? projectId, {
    int? limit = 100,
    String? bucket = r'prod',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listBuilderStatistic,
          [projectId],
          {
            #limit: limit,
            #bucket: bucket,
          },
        ),
        returnValue: _i21.Future<List<_i17.BuilderStatistic>>.value(<_i17.BuilderStatistic>[]),
      ) as _i21.Future<List<_i17.BuilderStatistic>>);

  @override
  _i21.Future<List<_i17.BuilderRecord>> listRecentBuildRecordsForBuilder(
    String? projectId, {
    String? builder,
    int? limit,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listRecentBuildRecordsForBuilder,
          [projectId],
          {
            #builder: builder,
            #limit: limit,
          },
        ),
        returnValue: _i21.Future<List<_i17.BuilderRecord>>.value(<_i17.BuilderRecord>[]),
      ) as _i21.Future<List<_i17.BuilderRecord>>);
}

/// A class which mocks [BranchService].
///
/// See the documentation for Mockito's code generation for more information.
class MockBranchService extends _i1.Mock implements _i16.BranchService {
  MockBranchService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i3.Config get config => (super.noSuchMethod(
        Invocation.getter(#config),
        returnValue: _FakeConfig_1(
          this,
          Invocation.getter(#config),
        ),
      ) as _i3.Config);

  @override
  _i7.GerritService get gerritService => (super.noSuchMethod(
        Invocation.getter(#gerritService),
        returnValue: _FakeGerritService_6(
          this,
          Invocation.getter(#gerritService),
        ),
      ) as _i7.GerritService);

  @override
  _i31.RetryOptions get retryOptions => (super.noSuchMethod(
        Invocation.getter(#retryOptions),
        returnValue: _i32.dummyValue<_i31.RetryOptions>(
          this,
          Invocation.getter(#retryOptions),
        ),
      ) as _i31.RetryOptions);

  @override
  _i21.Future<void> branchFlutterRecipes(
    String? branch,
    String? engineSha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #branchFlutterRecipes,
          [
            branch,
            engineSha,
          ],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<List<Map<String, String>>> getReleaseBranches({
    required _i18.GithubService? githubService,
    required _i14.RepositorySlug? slug,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseBranches,
          [],
          {
            #githubService: githubService,
            #slug: slug,
          },
        ),
        returnValue: _i21.Future<List<Map<String, String>>>.value(<Map<String, String>>[]),
      ) as _i21.Future<List<Map<String, String>>>);
}

/// A class which mocks [BuildBucketClient].
///
/// See the documentation for Mockito's code generation for more information.
// ignore: must_be_immutable
class MockBuildBucketClient extends _i1.Mock implements _i16.BuildBucketClient {
  MockBuildBucketClient() {
    _i1.throwOnMissingStub(this);
  }

  @override
  String get buildBucketBuildUri => (super.noSuchMethod(
        Invocation.getter(#buildBucketBuildUri),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#buildBucketBuildUri),
        ),
      ) as String);

  @override
  String get buildBucketBuilderUri => (super.noSuchMethod(
        Invocation.getter(#buildBucketBuilderUri),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#buildBucketBuilderUri),
        ),
      ) as String);

  @override
  _i2.Client get httpClient => (super.noSuchMethod(
        Invocation.getter(#httpClient),
        returnValue: _FakeClient_0(
          this,
          Invocation.getter(#httpClient),
        ),
      ) as _i2.Client);

  @override
  _i21.Future<_i8.Build> scheduleBuild(
    _i8.ScheduleBuildRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #scheduleBuild,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
          this,
          Invocation.method(
            #scheduleBuild,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i8.Build>);

  @override
  _i21.Future<_i8.SearchBuildsResponse> searchBuilds(
    _i8.SearchBuildsRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #searchBuilds,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i8.SearchBuildsResponse>.value(_FakeSearchBuildsResponse_8(
          this,
          Invocation.method(
            #searchBuilds,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i8.SearchBuildsResponse>);

  @override
  _i21.Future<_i8.BatchResponse> batch(
    _i8.BatchRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #batch,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i8.BatchResponse>.value(_FakeBatchResponse_9(
          this,
          Invocation.method(
            #batch,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i8.BatchResponse>);

  @override
  _i21.Future<_i8.Build> cancelBuild(
    _i8.CancelBuildRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #cancelBuild,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
          this,
          Invocation.method(
            #cancelBuild,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i8.Build>);

  @override
  _i21.Future<_i8.Build> getBuild(
    _i8.GetBuildRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuild,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
          this,
          Invocation.method(
            #getBuild,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i8.Build>);

  @override
  _i21.Future<_i8.ListBuildersResponse> listBuilders(
    _i8.ListBuildersRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builders',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listBuilders,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i8.ListBuildersResponse>.value(_FakeListBuildersResponse_10(
          this,
          Invocation.method(
            #listBuilders,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i8.ListBuildersResponse>);

  @override
  void close() => super.noSuchMethod(
        Invocation.method(
          #close,
          [],
        ),
        returnValueForMissingStub: null,
      );
}

/// A class which mocks [BuildBucketV2Client].
///
/// See the documentation for Mockito's code generation for more information.
// ignore: must_be_immutable
class MockBuildBucketV2Client extends _i1.Mock implements _i28.BuildBucketV2Client {
  MockBuildBucketV2Client() {
    _i1.throwOnMissingStub(this);
  }

  @override
  String get buildBucketBuildUri => (super.noSuchMethod(
        Invocation.getter(#buildBucketBuildUri),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#buildBucketBuildUri),
        ),
      ) as String);

  @override
  String get buildBucketBuilderUri => (super.noSuchMethod(
        Invocation.getter(#buildBucketBuilderUri),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#buildBucketBuilderUri),
        ),
      ) as String);

  @override
  _i2.Client get httpClient => (super.noSuchMethod(
        Invocation.getter(#httpClient),
        returnValue: _FakeClient_0(
          this,
          Invocation.getter(#httpClient),
        ),
      ) as _i2.Client);

  @override
  _i21.Future<_i9.Build> scheduleBuild(
    _i9.ScheduleBuildRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #scheduleBuild,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
          this,
          Invocation.method(
            #scheduleBuild,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i9.Build>);

  @override
  _i21.Future<_i9.SearchBuildsResponse> searchBuilds(
    _i9.SearchBuildsRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #searchBuilds,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i9.SearchBuildsResponse>.value(_FakeSearchBuildsResponse_12(
          this,
          Invocation.method(
            #searchBuilds,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i9.SearchBuildsResponse>);

  @override
  _i21.Future<_i9.BatchResponse> batch(
    _i9.BatchRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #batch,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i9.BatchResponse>.value(_FakeBatchResponse_13(
          this,
          Invocation.method(
            #batch,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i9.BatchResponse>);

  @override
  _i21.Future<_i9.Build> cancelBuild(
    _i9.CancelBuildRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #cancelBuild,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
          this,
          Invocation.method(
            #cancelBuild,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i9.Build>);

  @override
  _i21.Future<_i9.Build> getBuild(
    _i9.GetBuildRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builds',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuild,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
          this,
          Invocation.method(
            #getBuild,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i9.Build>);

  @override
  _i21.Future<_i9.ListBuildersResponse> listBuilders(
    _i9.ListBuildersRequest? request, {
    String? buildBucketUri = r'https://cr-buildbucket.appspot.com/prpc/buildbucket.v2.Builders',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listBuilders,
          [request],
          {#buildBucketUri: buildBucketUri},
        ),
        returnValue: _i21.Future<_i9.ListBuildersResponse>.value(_FakeListBuildersResponse_14(
          this,
          Invocation.method(
            #listBuilders,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i21.Future<_i9.ListBuildersResponse>);

  @override
  void close() => super.noSuchMethod(
        Invocation.method(
          #close,
          [],
        ),
        returnValueForMissingStub: null,
      );
}

/// A class which mocks [CommitService].
///
/// See the documentation for Mockito's code generation for more information.
class MockCommitService extends _i1.Mock implements _i33.CommitService {
  MockCommitService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i3.Config get config => (super.noSuchMethod(
        Invocation.getter(#config),
        returnValue: _FakeConfig_1(
          this,
          Invocation.getter(#config),
        ),
      ) as _i3.Config);

  @override
  _i10.DatastoreServiceProvider get datastoreProvider => (super.noSuchMethod(
        Invocation.getter(#datastoreProvider),
        returnValue: (_i12.DatastoreDB db) => _FakeDatastoreService_15(
          this,
          Invocation.getter(#datastoreProvider),
        ),
      ) as _i10.DatastoreServiceProvider);

  @override
  _i21.Future<void> handleCreateGithubRequest(_i34.CreateEvent? createEvent) => (super.noSuchMethod(
        Invocation.method(
          #handleCreateGithubRequest,
          [createEvent],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<void> handlePushGithubRequest(Map<String, dynamic>? pushEvent) => (super.noSuchMethod(
        Invocation.method(
          #handlePushGithubRequest,
          [pushEvent],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);
}

/// A class which mocks [Config].
///
/// See the documentation for Mockito's code generation for more information.
class MockConfig extends _i1.Mock implements _i3.Config {
  MockConfig() {
    _i1.throwOnMissingStub(this);
  }

  @override
  Set<_i14.RepositorySlug> get supportedRepos => (super.noSuchMethod(
        Invocation.getter(#supportedRepos),
        returnValue: <_i14.RepositorySlug>{},
      ) as Set<_i14.RepositorySlug>);

  @override
  Set<_i14.RepositorySlug> get postsubmitSupportedRepos => (super.noSuchMethod(
        Invocation.getter(#postsubmitSupportedRepos),
        returnValue: <_i14.RepositorySlug>{},
      ) as Set<_i14.RepositorySlug>);

  @override
  String get autosubmitBot => (super.noSuchMethod(
        Invocation.getter(#autosubmitBot),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#autosubmitBot),
        ),
      ) as String);

  @override
  _i11.Logging get loggingService => (super.noSuchMethod(
        Invocation.getter(#loggingService),
        returnValue: _FakeLogging_16(
          this,
          Invocation.getter(#loggingService),
        ),
      ) as _i11.Logging);

  @override
  _i21.Future<String> get githubPrivateKey => (super.noSuchMethod(
        Invocation.getter(#githubPrivateKey),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.getter(#githubPrivateKey),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<String> get overrideTreeStatusLabel => (super.noSuchMethod(
        Invocation.getter(#overrideTreeStatusLabel),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.getter(#overrideTreeStatusLabel),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<String> get githubPublicKey => (super.noSuchMethod(
        Invocation.getter(#githubPublicKey),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.getter(#githubPublicKey),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<String> get githubAppId => (super.noSuchMethod(
        Invocation.getter(#githubAppId),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.getter(#githubAppId),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<Map<String, dynamic>> get githubAppInstallations => (super.noSuchMethod(
        Invocation.getter(#githubAppInstallations),
        returnValue: _i21.Future<Map<String, dynamic>>.value(<String, dynamic>{}),
      ) as _i21.Future<Map<String, dynamic>>);

  @override
  String get defaultRecipeBundleRef => (super.noSuchMethod(
        Invocation.getter(#defaultRecipeBundleRef),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#defaultRecipeBundleRef),
        ),
      ) as String);

  @override
  _i12.DatastoreDB get db => (super.noSuchMethod(
        Invocation.getter(#db),
        returnValue: _FakeDatastoreDB_17(
          this,
          Invocation.getter(#db),
        ),
      ) as _i12.DatastoreDB);

  @override
  int get schedulingShardSize => (super.noSuchMethod(
        Invocation.getter(#schedulingShardSize),
        returnValue: 0,
      ) as int);

  @override
  int get batchSize => (super.noSuchMethod(
        Invocation.getter(#batchSize),
        returnValue: 0,
      ) as int);

  @override
  int get backfillerTargetLimit => (super.noSuchMethod(
        Invocation.getter(#backfillerTargetLimit),
        returnValue: 0,
      ) as int);

  @override
  int get backfillerCommitLimit => (super.noSuchMethod(
        Invocation.getter(#backfillerCommitLimit),
        returnValue: 0,
      ) as int);

  @override
  int get issueAndPRLimit => (super.noSuchMethod(
        Invocation.getter(#issueAndPRLimit),
        returnValue: 0,
      ) as int);

  @override
  _i21.Future<List<String>> get releaseAccounts => (super.noSuchMethod(
        Invocation.getter(#releaseAccounts),
        returnValue: _i21.Future<List<String>>.value(<String>[]),
      ) as _i21.Future<List<String>>);

  @override
  _i21.Future<String> get oauthClientId => (super.noSuchMethod(
        Invocation.getter(#oauthClientId),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.getter(#oauthClientId),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<String> get frobWebhookKey => (super.noSuchMethod(
        Invocation.getter(#frobWebhookKey),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.getter(#frobWebhookKey),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<String> get githubOAuthToken => (super.noSuchMethod(
        Invocation.getter(#githubOAuthToken),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.getter(#githubOAuthToken),
        )),
      ) as _i21.Future<String>);

  @override
  String get wrongBaseBranchPullRequestMessage => (super.noSuchMethod(
        Invocation.getter(#wrongBaseBranchPullRequestMessage),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#wrongBaseBranchPullRequestMessage),
        ),
      ) as String);

  @override
  String get releaseBranchPullRequestMessage => (super.noSuchMethod(
        Invocation.getter(#releaseBranchPullRequestMessage),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#releaseBranchPullRequestMessage),
        ),
      ) as String);

  @override
  _i21.Future<String> get webhookKey => (super.noSuchMethod(
        Invocation.getter(#webhookKey),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.getter(#webhookKey),
        )),
      ) as _i21.Future<String>);

  @override
  String get mergeConflictPullRequestMessage => (super.noSuchMethod(
        Invocation.getter(#mergeConflictPullRequestMessage),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#mergeConflictPullRequestMessage),
        ),
      ) as String);

  @override
  String get missingTestsPullRequestMessage => (super.noSuchMethod(
        Invocation.getter(#missingTestsPullRequestMessage),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#missingTestsPullRequestMessage),
        ),
      ) as String);

  @override
  String get flutterGoldPending => (super.noSuchMethod(
        Invocation.getter(#flutterGoldPending),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#flutterGoldPending),
        ),
      ) as String);

  @override
  String get flutterGoldSuccess => (super.noSuchMethod(
        Invocation.getter(#flutterGoldSuccess),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#flutterGoldSuccess),
        ),
      ) as String);

  @override
  String get flutterGoldChanges => (super.noSuchMethod(
        Invocation.getter(#flutterGoldChanges),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#flutterGoldChanges),
        ),
      ) as String);

  @override
  String get flutterGoldStalePR => (super.noSuchMethod(
        Invocation.getter(#flutterGoldStalePR),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#flutterGoldStalePR),
        ),
      ) as String);

  @override
  String get flutterGoldDraftChange => (super.noSuchMethod(
        Invocation.getter(#flutterGoldDraftChange),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#flutterGoldDraftChange),
        ),
      ) as String);

  @override
  int get maxTaskRetries => (super.noSuchMethod(
        Invocation.getter(#maxTaskRetries),
        returnValue: 0,
      ) as int);

  @override
  int get maxLuciTaskRetries => (super.noSuchMethod(
        Invocation.getter(#maxLuciTaskRetries),
        returnValue: 0,
      ) as int);

  @override
  int get commitNumber => (super.noSuchMethod(
        Invocation.getter(#commitNumber),
        returnValue: 0,
      ) as int);

  @override
  _i13.KeyHelper get keyHelper => (super.noSuchMethod(
        Invocation.getter(#keyHelper),
        returnValue: _FakeKeyHelper_18(
          this,
          Invocation.getter(#keyHelper),
        ),
      ) as _i13.KeyHelper);

  @override
  int get maxRecords => (super.noSuchMethod(
        Invocation.getter(#maxRecords),
        returnValue: 0,
      ) as int);

  @override
  Duration get githubRequestDelay => (super.noSuchMethod(
        Invocation.getter(#githubRequestDelay),
        returnValue: _FakeDuration_19(
          this,
          Invocation.getter(#githubRequestDelay),
        ),
      ) as Duration);

  @override
  String get flutterBuild => (super.noSuchMethod(
        Invocation.getter(#flutterBuild),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#flutterBuild),
        ),
      ) as String);

  @override
  String get flutterBuildDescription => (super.noSuchMethod(
        Invocation.getter(#flutterBuildDescription),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#flutterBuildDescription),
        ),
      ) as String);

  @override
  String get waitingForTreeToGoGreenLabelName => (super.noSuchMethod(
        Invocation.getter(#waitingForTreeToGoGreenLabelName),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#waitingForTreeToGoGreenLabelName),
        ),
      ) as String);

  @override
  Set<String> get rollerAccounts => (super.noSuchMethod(
        Invocation.getter(#rollerAccounts),
        returnValue: <String>{},
      ) as Set<String>);

  @override
  _i21.Future<Iterable<_i35.Branch>> getBranches(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getBranches,
          [slug],
        ),
        returnValue: _i21.Future<Iterable<_i35.Branch>>.value(<_i35.Branch>[]),
      ) as _i21.Future<Iterable<_i35.Branch>>);

  @override
  String wrongHeadBranchPullRequestMessage(String? branch) => (super.noSuchMethod(
        Invocation.method(
          #wrongHeadBranchPullRequestMessage,
          [branch],
        ),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.method(
            #wrongHeadBranchPullRequestMessage,
            [branch],
          ),
        ),
      ) as String);

  @override
  String flutterGoldInitialAlert(String? url) => (super.noSuchMethod(
        Invocation.method(
          #flutterGoldInitialAlert,
          [url],
        ),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.method(
            #flutterGoldInitialAlert,
            [url],
          ),
        ),
      ) as String);

  @override
  String flutterGoldFollowUpAlert(String? url) => (super.noSuchMethod(
        Invocation.method(
          #flutterGoldFollowUpAlert,
          [url],
        ),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.method(
            #flutterGoldFollowUpAlert,
            [url],
          ),
        ),
      ) as String);

  @override
  String flutterGoldAlertConstant(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #flutterGoldAlertConstant,
          [slug],
        ),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.method(
            #flutterGoldAlertConstant,
            [slug],
          ),
        ),
      ) as String);

  @override
  String flutterGoldCommentID(_i14.PullRequest? pr) => (super.noSuchMethod(
        Invocation.method(
          #flutterGoldCommentID,
          [pr],
        ),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.method(
            #flutterGoldCommentID,
            [pr],
          ),
        ),
      ) as String);

  @override
  _i21.Future<String> generateJsonWebToken() => (super.noSuchMethod(
        Invocation.method(
          #generateJsonWebToken,
          [],
        ),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.method(
            #generateJsonWebToken,
            [],
          ),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<String> generateGithubToken(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #generateGithubToken,
          [slug],
        ),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.method(
            #generateGithubToken,
            [slug],
          ),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<_i14.GitHub> createGitHubClient({
    _i14.PullRequest? pullRequest,
    _i14.RepositorySlug? slug,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createGitHubClient,
          [],
          {
            #pullRequest: pullRequest,
            #slug: slug,
          },
        ),
        returnValue: _i21.Future<_i14.GitHub>.value(_FakeGitHub_20(
          this,
          Invocation.method(
            #createGitHubClient,
            [],
            {
              #pullRequest: pullRequest,
              #slug: slug,
            },
          ),
        )),
      ) as _i21.Future<_i14.GitHub>);

  @override
  _i14.GitHub createGitHubClientWithToken(String? token) => (super.noSuchMethod(
        Invocation.method(
          #createGitHubClientWithToken,
          [token],
        ),
        returnValue: _FakeGitHub_20(
          this,
          Invocation.method(
            #createGitHubClientWithToken,
            [token],
          ),
        ),
      ) as _i14.GitHub);

  @override
  _i21.Future<_i15.GraphQLClient> createGitHubGraphQLClient() => (super.noSuchMethod(
        Invocation.method(
          #createGitHubGraphQLClient,
          [],
        ),
        returnValue: _i21.Future<_i15.GraphQLClient>.value(_FakeGraphQLClient_21(
          this,
          Invocation.method(
            #createGitHubGraphQLClient,
            [],
          ),
        )),
      ) as _i21.Future<_i15.GraphQLClient>);

  @override
  _i21.Future<_i16.FirestoreService> createFirestoreService() => (super.noSuchMethod(
        Invocation.method(
          #createFirestoreService,
          [],
        ),
        returnValue: _i21.Future<_i16.FirestoreService>.value(_FakeFirestoreService_22(
          this,
          Invocation.method(
            #createFirestoreService,
            [],
          ),
        )),
      ) as _i21.Future<_i16.FirestoreService>);

  @override
  _i21.Future<_i17.BigqueryService> createBigQueryService() => (super.noSuchMethod(
        Invocation.method(
          #createBigQueryService,
          [],
        ),
        returnValue: _i21.Future<_i17.BigqueryService>.value(_FakeBigqueryService_23(
          this,
          Invocation.method(
            #createBigQueryService,
            [],
          ),
        )),
      ) as _i21.Future<_i17.BigqueryService>);

  @override
  _i21.Future<_i6.TabledataResource> createTabledataResourceApi() => (super.noSuchMethod(
        Invocation.method(
          #createTabledataResourceApi,
          [],
        ),
        returnValue: _i21.Future<_i6.TabledataResource>.value(_FakeTabledataResource_4(
          this,
          Invocation.method(
            #createTabledataResourceApi,
            [],
          ),
        )),
      ) as _i21.Future<_i6.TabledataResource>);

  @override
  _i21.Future<_i18.GithubService> createDefaultGitHubService() => (super.noSuchMethod(
        Invocation.method(
          #createDefaultGitHubService,
          [],
        ),
        returnValue: _i21.Future<_i18.GithubService>.value(_FakeGithubService_24(
          this,
          Invocation.method(
            #createDefaultGitHubService,
            [],
          ),
        )),
      ) as _i21.Future<_i18.GithubService>);

  @override
  _i21.Future<_i18.GithubService> createGithubService(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #createGithubService,
          [slug],
        ),
        returnValue: _i21.Future<_i18.GithubService>.value(_FakeGithubService_24(
          this,
          Invocation.method(
            #createGithubService,
            [slug],
          ),
        )),
      ) as _i21.Future<_i18.GithubService>);

  @override
  _i18.GithubService createGithubServiceWithToken(String? token) => (super.noSuchMethod(
        Invocation.method(
          #createGithubServiceWithToken,
          [token],
        ),
        returnValue: _FakeGithubService_24(
          this,
          Invocation.method(
            #createGithubServiceWithToken,
            [token],
          ),
        ),
      ) as _i18.GithubService);
}

/// A class which mocks [DatastoreService].
///
/// See the documentation for Mockito's code generation for more information.
// ignore: must_be_immutable
class MockDatastoreService extends _i1.Mock implements _i10.DatastoreService {
  MockDatastoreService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  int get maxEntityGroups => (super.noSuchMethod(
        Invocation.getter(#maxEntityGroups),
        returnValue: 0,
      ) as int);

  @override
  _i12.DatastoreDB get db => (super.noSuchMethod(
        Invocation.getter(#db),
        returnValue: _FakeDatastoreDB_17(
          this,
          Invocation.getter(#db),
        ),
      ) as _i12.DatastoreDB);

  @override
  _i31.RetryOptions get retryOptions => (super.noSuchMethod(
        Invocation.getter(#retryOptions),
        returnValue: _i32.dummyValue<_i31.RetryOptions>(
          this,
          Invocation.getter(#retryOptions),
        ),
      ) as _i31.RetryOptions);

  @override
  _i21.Stream<_i36.Commit> queryRecentCommits({
    int? limit = 100,
    int? timestamp,
    String? branch,
    required _i14.RepositorySlug? slug,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #queryRecentCommits,
          [],
          {
            #limit: limit,
            #timestamp: timestamp,
            #branch: branch,
            #slug: slug,
          },
        ),
        returnValue: _i21.Stream<_i36.Commit>.empty(),
      ) as _i21.Stream<_i36.Commit>);

  @override
  _i21.Stream<_i35.Branch> queryBranches() => (super.noSuchMethod(
        Invocation.method(
          #queryBranches,
          [],
        ),
        returnValue: _i21.Stream<_i35.Branch>.empty(),
      ) as _i21.Stream<_i35.Branch>);

  @override
  _i21.Stream<_i37.Task> queryRecentTasksByName({
    int? limit = 100,
    required String? name,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #queryRecentTasksByName,
          [],
          {
            #limit: limit,
            #name: name,
          },
        ),
        returnValue: _i21.Stream<_i37.Task>.empty(),
      ) as _i21.Stream<_i37.Task>);

  @override
  _i21.Stream<_i37.FullTask> queryRecentTasks({
    String? taskName,
    int? commitLimit = 20,
    String? branch,
    required _i14.RepositorySlug? slug,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #queryRecentTasks,
          [],
          {
            #taskName: taskName,
            #commitLimit: commitLimit,
            #branch: branch,
            #slug: slug,
          },
        ),
        returnValue: _i21.Stream<_i37.FullTask>.empty(),
      ) as _i21.Stream<_i37.FullTask>);

  @override
  _i21.Future<List<_i38.Stage>> queryTasksGroupedByStage(_i36.Commit? commit) => (super.noSuchMethod(
        Invocation.method(
          #queryTasksGroupedByStage,
          [commit],
        ),
        returnValue: _i21.Future<List<_i38.Stage>>.value(<_i38.Stage>[]),
      ) as _i21.Future<List<_i38.Stage>>);

  @override
  _i21.Future<_i19.GithubBuildStatusUpdate> queryLastStatusUpdate(
    _i14.RepositorySlug? slug,
    _i14.PullRequest? pr,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #queryLastStatusUpdate,
          [
            slug,
            pr,
          ],
        ),
        returnValue: _i21.Future<_i19.GithubBuildStatusUpdate>.value(_FakeGithubBuildStatusUpdate_25(
          this,
          Invocation.method(
            #queryLastStatusUpdate,
            [
              slug,
              pr,
            ],
          ),
        )),
      ) as _i21.Future<_i19.GithubBuildStatusUpdate>);

  @override
  _i21.Future<_i20.GithubGoldStatusUpdate> queryLastGoldUpdate(
    _i14.RepositorySlug? slug,
    _i14.PullRequest? pr,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #queryLastGoldUpdate,
          [
            slug,
            pr,
          ],
        ),
        returnValue: _i21.Future<_i20.GithubGoldStatusUpdate>.value(_FakeGithubGoldStatusUpdate_26(
          this,
          Invocation.method(
            #queryLastGoldUpdate,
            [
              slug,
              pr,
            ],
          ),
        )),
      ) as _i21.Future<_i20.GithubGoldStatusUpdate>);

  @override
  _i21.Future<List<List<_i12.Model<dynamic>>>> shard(List<_i12.Model<dynamic>>? rows) => (super.noSuchMethod(
        Invocation.method(
          #shard,
          [rows],
        ),
        returnValue: _i21.Future<List<List<_i12.Model<dynamic>>>>.value(<List<_i12.Model<dynamic>>>[]),
      ) as _i21.Future<List<List<_i12.Model<dynamic>>>>);

  @override
  _i21.Future<void> insert(List<_i12.Model<dynamic>>? rows) => (super.noSuchMethod(
        Invocation.method(
          #insert,
          [rows],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<List<T?>> lookupByKey<T extends _i12.Model<dynamic>>(List<_i12.Key<dynamic>>? keys) =>
      (super.noSuchMethod(
        Invocation.method(
          #lookupByKey,
          [keys],
        ),
        returnValue: _i21.Future<List<T?>>.value(<T?>[]),
      ) as _i21.Future<List<T?>>);

  @override
  _i21.Future<T> lookupByValue<T extends _i12.Model<dynamic>>(
    _i12.Key<dynamic>? key, {
    T Function()? orElse,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #lookupByValue,
          [key],
          {#orElse: orElse},
        ),
        returnValue: _i32.ifNotNull(
              _i32.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #lookupByValue,
                  [key],
                  {#orElse: orElse},
                ),
              ),
              (T v) => _i21.Future<T>.value(v),
            ) ??
            _FakeFuture_27<T>(
              this,
              Invocation.method(
                #lookupByValue,
                [key],
                {#orElse: orElse},
              ),
            ),
      ) as _i21.Future<T>);

  @override
  _i21.Future<T?> withTransaction<T>(_i21.Future<T> Function(_i12.Transaction)? handler) => (super.noSuchMethod(
        Invocation.method(
          #withTransaction,
          [handler],
        ),
        returnValue: _i21.Future<T?>.value(),
      ) as _i21.Future<T?>);

  @override
  _i21.Future<_i37.Task?> getTaskFromBuildbucketBuild(
    _i8.Build? build, {
    String? customName,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTaskFromBuildbucketBuild,
          [build],
          {#customName: customName},
        ),
        returnValue: _i21.Future<_i37.Task?>.value(),
      ) as _i21.Future<_i37.Task?>);

  @override
  _i21.Future<_i37.Task?> getTaskFromBuildbucketV2Build(
    _i9.Build? build, {
    String? customName,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTaskFromBuildbucketV2Build,
          [build],
          {#customName: customName},
        ),
        returnValue: _i21.Future<_i37.Task?>.value(),
      ) as _i21.Future<_i37.Task?>);
}

/// A class which mocks [FakeEntry].
///
/// See the documentation for Mockito's code generation for more information.
class MockFakeEntry extends _i1.Mock implements _i39.FakeEntry {
  MockFakeEntry() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i40.Uint8List get value => (super.noSuchMethod(
        Invocation.getter(#value),
        returnValue: _i40.Uint8List(0),
      ) as _i40.Uint8List);

  @override
  set value(_i40.Uint8List? _value) => super.noSuchMethod(
        Invocation.setter(
          #value,
          _value,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i21.Future<_i40.Uint8List> get([
    _i21.Future<_i40.Uint8List?> Function()? create,
    Duration? ttl,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            create,
            ttl,
          ],
        ),
        returnValue: _i21.Future<_i40.Uint8List>.value(_i40.Uint8List(0)),
      ) as _i21.Future<_i40.Uint8List>);

  @override
  _i21.Future<void> purge({int? retries = 0}) => (super.noSuchMethod(
        Invocation.method(
          #purge,
          [],
          {#retries: retries},
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<_i40.Uint8List?> set(
    _i40.Uint8List? value, [
    Duration? ttl,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #set,
          [
            value,
            ttl,
          ],
        ),
        returnValue: _i21.Future<_i40.Uint8List?>.value(),
      ) as _i21.Future<_i40.Uint8List?>);
}

/// A class which mocks [FirestoreService].
///
/// See the documentation for Mockito's code generation for more information.
class MockFirestoreService extends _i1.Mock implements _i16.FirestoreService {
  MockFirestoreService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i5.AccessClientProvider get accessClientProvider => (super.noSuchMethod(
        Invocation.getter(#accessClientProvider),
        returnValue: _FakeAccessClientProvider_3(
          this,
          Invocation.getter(#accessClientProvider),
        ),
      ) as _i5.AccessClientProvider);

  @override
  _i21.Future<_i22.ProjectsDatabasesDocumentsResource> documentResource() => (super.noSuchMethod(
        Invocation.method(
          #documentResource,
          [],
        ),
        returnValue:
            _i21.Future<_i22.ProjectsDatabasesDocumentsResource>.value(_FakeProjectsDatabasesDocumentsResource_28(
          this,
          Invocation.method(
            #documentResource,
            [],
          ),
        )),
      ) as _i21.Future<_i22.ProjectsDatabasesDocumentsResource>);

  @override
  _i21.Future<_i22.Document> getDocument(String? name) => (super.noSuchMethod(
        Invocation.method(
          #getDocument,
          [name],
        ),
        returnValue: _i21.Future<_i22.Document>.value(_FakeDocument_29(
          this,
          Invocation.method(
            #getDocument,
            [name],
          ),
        )),
      ) as _i21.Future<_i22.Document>);

  @override
  _i21.Future<_i22.BatchWriteResponse> batchWriteDocuments(
    _i22.BatchWriteRequest? request,
    String? database,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #batchWriteDocuments,
          [
            request,
            database,
          ],
        ),
        returnValue: _i21.Future<_i22.BatchWriteResponse>.value(_FakeBatchWriteResponse_30(
          this,
          Invocation.method(
            #batchWriteDocuments,
            [
              request,
              database,
            ],
          ),
        )),
      ) as _i21.Future<_i22.BatchWriteResponse>);

  @override
  _i21.Future<_i22.CommitResponse> writeViaTransaction(List<_i22.Write>? writes) => (super.noSuchMethod(
        Invocation.method(
          #writeViaTransaction,
          [writes],
        ),
        returnValue: _i21.Future<_i22.CommitResponse>.value(_FakeCommitResponse_31(
          this,
          Invocation.method(
            #writeViaTransaction,
            [writes],
          ),
        )),
      ) as _i21.Future<_i22.CommitResponse>);

  @override
  _i21.Future<List<_i41.Commit>> queryRecentCommits({
    int? limit = 100,
    int? timestamp,
    String? branch,
    required _i14.RepositorySlug? slug,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #queryRecentCommits,
          [],
          {
            #limit: limit,
            #timestamp: timestamp,
            #branch: branch,
            #slug: slug,
          },
        ),
        returnValue: _i21.Future<List<_i41.Commit>>.value(<_i41.Commit>[]),
      ) as _i21.Future<List<_i41.Commit>>);

  @override
  _i21.Future<List<_i42.Task>> queryCommitTasks(String? commitSha) => (super.noSuchMethod(
        Invocation.method(
          #queryCommitTasks,
          [commitSha],
        ),
        returnValue: _i21.Future<List<_i42.Task>>.value(<_i42.Task>[]),
      ) as _i21.Future<List<_i42.Task>>);

  @override
  _i21.Future<_i23.GithubGoldStatus> queryLastGoldStatus(
    _i14.RepositorySlug? slug,
    int? prNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #queryLastGoldStatus,
          [
            slug,
            prNumber,
          ],
        ),
        returnValue: _i21.Future<_i23.GithubGoldStatus>.value(_FakeGithubGoldStatus_32(
          this,
          Invocation.method(
            #queryLastGoldStatus,
            [
              slug,
              prNumber,
            ],
          ),
        )),
      ) as _i21.Future<_i23.GithubGoldStatus>);

  @override
  _i21.Future<_i24.GithubBuildStatus> queryLastBuildStatus(
    _i14.RepositorySlug? slug,
    int? prNumber,
    String? head,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #queryLastBuildStatus,
          [
            slug,
            prNumber,
            head,
          ],
        ),
        returnValue: _i21.Future<_i24.GithubBuildStatus>.value(_FakeGithubBuildStatus_33(
          this,
          Invocation.method(
            #queryLastBuildStatus,
            [
              slug,
              prNumber,
              head,
            ],
          ),
        )),
      ) as _i21.Future<_i24.GithubBuildStatus>);

  @override
  _i22.Value getValueFromFilter(Object? comparisonOject) => (super.noSuchMethod(
        Invocation.method(
          #getValueFromFilter,
          [comparisonOject],
        ),
        returnValue: _FakeValue_34(
          this,
          Invocation.method(
            #getValueFromFilter,
            [comparisonOject],
          ),
        ),
      ) as _i22.Value);

  @override
  _i22.Filter generateFilter(
    Map<String, Object>? filterMap,
    String? compositeFilterOp,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #generateFilter,
          [
            filterMap,
            compositeFilterOp,
          ],
        ),
        returnValue: _FakeFilter_35(
          this,
          Invocation.method(
            #generateFilter,
            [
              filterMap,
              compositeFilterOp,
            ],
          ),
        ),
      ) as _i22.Filter);

  @override
  _i21.Future<List<_i22.Document>> query(
    String? collectionId,
    Map<String, Object>? filterMap, {
    int? limit,
    Map<String, String>? orderMap,
    String? compositeFilterOp = r'AND',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #query,
          [
            collectionId,
            filterMap,
          ],
          {
            #limit: limit,
            #orderMap: orderMap,
            #compositeFilterOp: compositeFilterOp,
          },
        ),
        returnValue: _i21.Future<List<_i22.Document>>.value(<_i22.Document>[]),
      ) as _i21.Future<List<_i22.Document>>);

  @override
  List<_i22.Document> documentsFromQueryResponse(List<_i22.RunQueryResponseElement>? runQueryResponseElements) =>
      (super.noSuchMethod(
        Invocation.method(
          #documentsFromQueryResponse,
          [runQueryResponseElements],
        ),
        returnValue: <_i22.Document>[],
      ) as List<_i22.Document>);
}

/// A class which mocks [IssuesService].
///
/// See the documentation for Mockito's code generation for more information.
class MockIssuesService extends _i1.Mock implements _i14.IssuesService {
  MockIssuesService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i14.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_20(
          this,
          Invocation.getter(#github),
        ),
      ) as _i14.GitHub);

  @override
  _i21.Stream<_i14.Issue> listAll({
    int? milestoneNumber,
    String? state,
    String? direction,
    String? sort,
    DateTime? since,
    int? perPage,
    List<String>? labels,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listAll,
          [],
          {
            #milestoneNumber: milestoneNumber,
            #state: state,
            #direction: direction,
            #sort: sort,
            #since: since,
            #perPage: perPage,
            #labels: labels,
          },
        ),
        returnValue: _i21.Stream<_i14.Issue>.empty(),
      ) as _i21.Stream<_i14.Issue>);

  @override
  _i21.Stream<_i14.Issue> listByUser({
    int? milestoneNumber,
    String? state,
    String? direction,
    String? sort,
    DateTime? since,
    int? perPage,
    List<String>? labels,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listByUser,
          [],
          {
            #milestoneNumber: milestoneNumber,
            #state: state,
            #direction: direction,
            #sort: sort,
            #since: since,
            #perPage: perPage,
            #labels: labels,
          },
        ),
        returnValue: _i21.Stream<_i14.Issue>.empty(),
      ) as _i21.Stream<_i14.Issue>);

  @override
  _i21.Stream<_i14.Issue> listByOrg(
    String? org, {
    int? milestoneNumber,
    String? state,
    String? direction,
    String? sort,
    DateTime? since,
    int? perPage,
    List<String>? labels,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listByOrg,
          [org],
          {
            #milestoneNumber: milestoneNumber,
            #state: state,
            #direction: direction,
            #sort: sort,
            #since: since,
            #perPage: perPage,
            #labels: labels,
          },
        ),
        returnValue: _i21.Stream<_i14.Issue>.empty(),
      ) as _i21.Stream<_i14.Issue>);

  @override
  _i21.Stream<_i14.Issue> listByRepo(
    _i14.RepositorySlug? slug, {
    int? milestoneNumber,
    String? state,
    String? direction,
    String? sort,
    DateTime? since,
    int? perPage,
    List<String>? labels,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listByRepo,
          [slug],
          {
            #milestoneNumber: milestoneNumber,
            #state: state,
            #direction: direction,
            #sort: sort,
            #since: since,
            #perPage: perPage,
            #labels: labels,
          },
        ),
        returnValue: _i21.Stream<_i14.Issue>.empty(),
      ) as _i21.Stream<_i14.Issue>);

  @override
  _i21.Stream<_i14.Reaction> listReactions(
    _i14.RepositorySlug? slug,
    int? issueNumber, {
    _i14.ReactionType? content,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReactions,
          [
            slug,
            issueNumber,
          ],
          {#content: content},
        ),
        returnValue: _i21.Stream<_i14.Reaction>.empty(),
      ) as _i21.Stream<_i14.Reaction>);

  @override
  _i21.Future<_i14.Issue> edit(
    _i14.RepositorySlug? slug,
    int? issueNumber,
    _i14.IssueRequest? issue,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #edit,
          [
            slug,
            issueNumber,
            issue,
          ],
        ),
        returnValue: _i21.Future<_i14.Issue>.value(_FakeIssue_36(
          this,
          Invocation.method(
            #edit,
            [
              slug,
              issueNumber,
              issue,
            ],
          ),
        )),
      ) as _i21.Future<_i14.Issue>);

  @override
  _i21.Future<_i14.Issue> get(
    _i14.RepositorySlug? slug,
    int? issueNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            slug,
            issueNumber,
          ],
        ),
        returnValue: _i21.Future<_i14.Issue>.value(_FakeIssue_36(
          this,
          Invocation.method(
            #get,
            [
              slug,
              issueNumber,
            ],
          ),
        )),
      ) as _i21.Future<_i14.Issue>);

  @override
  _i21.Future<_i14.Issue> create(
    _i14.RepositorySlug? slug,
    _i14.IssueRequest? issue,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #create,
          [
            slug,
            issue,
          ],
        ),
        returnValue: _i21.Future<_i14.Issue>.value(_FakeIssue_36(
          this,
          Invocation.method(
            #create,
            [
              slug,
              issue,
            ],
          ),
        )),
      ) as _i21.Future<_i14.Issue>);

  @override
  _i21.Stream<_i14.User> listAssignees(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listAssignees,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.User>.empty(),
      ) as _i21.Stream<_i14.User>);

  @override
  _i21.Future<bool> isAssignee(
    _i14.RepositorySlug? slug,
    String? repoName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isAssignee,
          [
            slug,
            repoName,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.IssueComment> listCommentsByIssue(
    _i14.RepositorySlug? slug,
    int? issueNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommentsByIssue,
          [
            slug,
            issueNumber,
          ],
        ),
        returnValue: _i21.Stream<_i14.IssueComment>.empty(),
      ) as _i21.Stream<_i14.IssueComment>);

  @override
  _i21.Stream<_i14.IssueComment> listCommentsByRepo(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommentsByRepo,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.IssueComment>.empty(),
      ) as _i21.Stream<_i14.IssueComment>);

  @override
  _i21.Future<_i14.IssueComment> getComment(
    _i14.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getComment,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i21.Future<_i14.IssueComment>.value(_FakeIssueComment_37(
          this,
          Invocation.method(
            #getComment,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i21.Future<_i14.IssueComment>);

  @override
  _i21.Future<_i14.IssueComment> createComment(
    _i14.RepositorySlug? slug,
    int? issueNumber,
    String? body,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createComment,
          [
            slug,
            issueNumber,
            body,
          ],
        ),
        returnValue: _i21.Future<_i14.IssueComment>.value(_FakeIssueComment_37(
          this,
          Invocation.method(
            #createComment,
            [
              slug,
              issueNumber,
              body,
            ],
          ),
        )),
      ) as _i21.Future<_i14.IssueComment>);

  @override
  _i21.Future<_i14.IssueComment> updateComment(
    _i14.RepositorySlug? slug,
    int? id,
    String? body,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateComment,
          [
            slug,
            id,
            body,
          ],
        ),
        returnValue: _i21.Future<_i14.IssueComment>.value(_FakeIssueComment_37(
          this,
          Invocation.method(
            #updateComment,
            [
              slug,
              id,
              body,
            ],
          ),
        )),
      ) as _i21.Future<_i14.IssueComment>);

  @override
  _i21.Future<bool> deleteComment(
    _i14.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteComment,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.IssueLabel> listLabels(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listLabels,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.IssueLabel>.empty(),
      ) as _i21.Stream<_i14.IssueLabel>);

  @override
  _i21.Future<_i14.IssueLabel> getLabel(
    _i14.RepositorySlug? slug,
    String? name,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getLabel,
          [
            slug,
            name,
          ],
        ),
        returnValue: _i21.Future<_i14.IssueLabel>.value(_FakeIssueLabel_38(
          this,
          Invocation.method(
            #getLabel,
            [
              slug,
              name,
            ],
          ),
        )),
      ) as _i21.Future<_i14.IssueLabel>);

  @override
  _i21.Future<_i14.IssueLabel> createLabel(
    _i14.RepositorySlug? slug,
    String? name, {
    String? color,
    String? description,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createLabel,
          [
            slug,
            name,
          ],
          {
            #color: color,
            #description: description,
          },
        ),
        returnValue: _i21.Future<_i14.IssueLabel>.value(_FakeIssueLabel_38(
          this,
          Invocation.method(
            #createLabel,
            [
              slug,
              name,
            ],
            {
              #color: color,
              #description: description,
            },
          ),
        )),
      ) as _i21.Future<_i14.IssueLabel>);

  @override
  _i21.Future<_i14.IssueLabel> editLabel(
    _i14.RepositorySlug? slug,
    String? name,
    String? color,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #editLabel,
          [
            slug,
            name,
            color,
          ],
        ),
        returnValue: _i21.Future<_i14.IssueLabel>.value(_FakeIssueLabel_38(
          this,
          Invocation.method(
            #editLabel,
            [
              slug,
              name,
              color,
            ],
          ),
        )),
      ) as _i21.Future<_i14.IssueLabel>);

  @override
  _i21.Future<_i14.IssueLabel> updateLabel(
    _i14.RepositorySlug? slug,
    String? name, {
    String? newName,
    String? color,
    String? description,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateLabel,
          [
            slug,
            name,
          ],
          {
            #newName: newName,
            #color: color,
            #description: description,
          },
        ),
        returnValue: _i21.Future<_i14.IssueLabel>.value(_FakeIssueLabel_38(
          this,
          Invocation.method(
            #updateLabel,
            [
              slug,
              name,
            ],
            {
              #newName: newName,
              #color: color,
              #description: description,
            },
          ),
        )),
      ) as _i21.Future<_i14.IssueLabel>);

  @override
  _i21.Future<bool> deleteLabel(
    _i14.RepositorySlug? slug,
    String? name,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteLabel,
          [
            slug,
            name,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.IssueLabel> listLabelsByIssue(
    _i14.RepositorySlug? slug,
    int? issueNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listLabelsByIssue,
          [
            slug,
            issueNumber,
          ],
        ),
        returnValue: _i21.Stream<_i14.IssueLabel>.empty(),
      ) as _i21.Stream<_i14.IssueLabel>);

  @override
  _i21.Future<List<_i14.IssueLabel>> addLabelsToIssue(
    _i14.RepositorySlug? slug,
    int? issueNumber,
    List<String>? labels,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #addLabelsToIssue,
          [
            slug,
            issueNumber,
            labels,
          ],
        ),
        returnValue: _i21.Future<List<_i14.IssueLabel>>.value(<_i14.IssueLabel>[]),
      ) as _i21.Future<List<_i14.IssueLabel>>);

  @override
  _i21.Future<List<_i14.IssueLabel>> replaceLabelsForIssue(
    _i14.RepositorySlug? slug,
    int? issueNumber,
    List<String>? labels,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #replaceLabelsForIssue,
          [
            slug,
            issueNumber,
            labels,
          ],
        ),
        returnValue: _i21.Future<List<_i14.IssueLabel>>.value(<_i14.IssueLabel>[]),
      ) as _i21.Future<List<_i14.IssueLabel>>);

  @override
  _i21.Future<bool> removeLabelForIssue(
    _i14.RepositorySlug? slug,
    int? issueNumber,
    String? label,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeLabelForIssue,
          [
            slug,
            issueNumber,
            label,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<bool> removeAllLabelsForIssue(
    _i14.RepositorySlug? slug,
    int? issueNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeAllLabelsForIssue,
          [
            slug,
            issueNumber,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.Milestone> listMilestones(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listMilestones,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.Milestone>.empty(),
      ) as _i21.Stream<_i14.Milestone>);

  @override
  _i21.Future<_i14.Milestone> createMilestone(
    _i14.RepositorySlug? slug,
    _i14.CreateMilestone? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createMilestone,
          [
            slug,
            request,
          ],
        ),
        returnValue: _i21.Future<_i14.Milestone>.value(_FakeMilestone_39(
          this,
          Invocation.method(
            #createMilestone,
            [
              slug,
              request,
            ],
          ),
        )),
      ) as _i21.Future<_i14.Milestone>);

  @override
  _i21.Future<bool> deleteMilestone(
    _i14.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteMilestone,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.TimelineEvent> listTimeline(
    _i14.RepositorySlug? slug,
    int? issueNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listTimeline,
          [
            slug,
            issueNumber,
          ],
        ),
        returnValue: _i21.Stream<_i14.TimelineEvent>.empty(),
      ) as _i21.Stream<_i14.TimelineEvent>);

  @override
  _i21.Future<void> lock(
    _i14.RepositorySlug? slug,
    int? number, {
    String? lockReason,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #lock,
          [
            slug,
            number,
          ],
          {#lockReason: lockReason},
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<void> unlock(
    _i14.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #unlock,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);
}

/// A class which mocks [GithubChecksService].
///
/// See the documentation for Mockito's code generation for more information.
class MockGithubChecksService extends _i1.Mock implements _i16.GithubChecksService {
  MockGithubChecksService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i3.Config get config => (super.noSuchMethod(
        Invocation.getter(#config),
        returnValue: _FakeConfig_1(
          this,
          Invocation.getter(#config),
        ),
      ) as _i3.Config);

  @override
  set config(_i3.Config? _config) => super.noSuchMethod(
        Invocation.setter(
          #config,
          _config,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i25.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
        Invocation.getter(#githubChecksUtil),
        returnValue: _FakeGithubChecksUtil_40(
          this,
          Invocation.getter(#githubChecksUtil),
        ),
      ) as _i25.GithubChecksUtil);

  @override
  set githubChecksUtil(_i25.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
        Invocation.setter(
          #githubChecksUtil,
          _githubChecksUtil,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i21.Future<void> handleCheckSuite(
    _i14.PullRequest? pullRequest,
    _i34.CheckSuiteEvent? checkSuiteEvent,
    _i16.Scheduler? scheduler,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #handleCheckSuite,
          [
            pullRequest,
            checkSuiteEvent,
            scheduler,
          ],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<bool> updateCheckStatus(
    _i43.BuildPushMessage? buildPushMessage,
    _i16.LuciBuildService? luciBuildService,
    _i14.RepositorySlug? slug, {
    bool? rescheduled = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCheckStatus,
          [
            buildPushMessage,
            luciBuildService,
            slug,
          ],
          {#rescheduled: rescheduled},
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  bool taskFailed(_i43.BuildPushMessage? buildPushMessage) => (super.noSuchMethod(
        Invocation.method(
          #taskFailed,
          [buildPushMessage],
        ),
        returnValue: false,
      ) as bool);

  @override
  int currentAttempt(_i43.Build? build) => (super.noSuchMethod(
        Invocation.method(
          #currentAttempt,
          [build],
        ),
        returnValue: 0,
      ) as int);

  @override
  String getGithubSummary(String? summary) => (super.noSuchMethod(
        Invocation.method(
          #getGithubSummary,
          [summary],
        ),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.method(
            #getGithubSummary,
            [summary],
          ),
        ),
      ) as String);

  @override
  _i14.CheckRunConclusion conclusionForResult(_i43.Result? result) => (super.noSuchMethod(
        Invocation.method(
          #conclusionForResult,
          [result],
        ),
        returnValue: _FakeCheckRunConclusion_41(
          this,
          Invocation.method(
            #conclusionForResult,
            [result],
          ),
        ),
      ) as _i14.CheckRunConclusion);

  @override
  _i14.CheckRunStatus statusForResult(_i43.Status? status) => (super.noSuchMethod(
        Invocation.method(
          #statusForResult,
          [status],
        ),
        returnValue: _FakeCheckRunStatus_42(
          this,
          Invocation.method(
            #statusForResult,
            [status],
          ),
        ),
      ) as _i14.CheckRunStatus);

  @override
  _i21.Future<_i14.PullRequest?> findMatchingPullRequest(
    _i14.RepositorySlug? slug,
    String? headSha,
    int? checkSuiteId,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #findMatchingPullRequest,
          [
            slug,
            headSha,
            checkSuiteId,
          ],
        ),
        returnValue: _i21.Future<_i14.PullRequest?>.value(),
      ) as _i21.Future<_i14.PullRequest?>);
}

/// A class which mocks [GithubChecksServiceV2].
///
/// See the documentation for Mockito's code generation for more information.
class MockGithubChecksServiceV2 extends _i1.Mock implements _i44.GithubChecksServiceV2 {
  MockGithubChecksServiceV2() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i3.Config get config => (super.noSuchMethod(
        Invocation.getter(#config),
        returnValue: _FakeConfig_1(
          this,
          Invocation.getter(#config),
        ),
      ) as _i3.Config);

  @override
  set config(_i3.Config? _config) => super.noSuchMethod(
        Invocation.setter(
          #config,
          _config,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i25.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
        Invocation.getter(#githubChecksUtil),
        returnValue: _FakeGithubChecksUtil_40(
          this,
          Invocation.getter(#githubChecksUtil),
        ),
      ) as _i25.GithubChecksUtil);

  @override
  set githubChecksUtil(_i25.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
        Invocation.setter(
          #githubChecksUtil,
          _githubChecksUtil,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i21.Future<void> handleCheckSuite(
    _i14.PullRequest? pullRequest,
    _i34.CheckSuiteEvent? checkSuiteEvent,
    _i45.SchedulerV2? scheduler,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #handleCheckSuite,
          [
            pullRequest,
            checkSuiteEvent,
            scheduler,
          ],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<bool> updateCheckStatus({
    required _i9.Build? build,
    required Map<String, dynamic>? userDataMap,
    required _i46.LuciBuildServiceV2? luciBuildService,
    required _i14.RepositorySlug? slug,
    bool? rescheduled = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCheckStatus,
          [],
          {
            #build: build,
            #userDataMap: userDataMap,
            #luciBuildService: luciBuildService,
            #slug: slug,
            #rescheduled: rescheduled,
          },
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  bool taskFailed(_i9.Status? status) => (super.noSuchMethod(
        Invocation.method(
          #taskFailed,
          [status],
        ),
        returnValue: false,
      ) as bool);

  @override
  int currentAttempt(List<_i9.StringPair>? tags) => (super.noSuchMethod(
        Invocation.method(
          #currentAttempt,
          [tags],
        ),
        returnValue: 0,
      ) as int);

  @override
  String getGithubSummary(String? summary) => (super.noSuchMethod(
        Invocation.method(
          #getGithubSummary,
          [summary],
        ),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.method(
            #getGithubSummary,
            [summary],
          ),
        ),
      ) as String);

  @override
  _i14.CheckRunConclusion conclusionForResult(_i9.Status? status) => (super.noSuchMethod(
        Invocation.method(
          #conclusionForResult,
          [status],
        ),
        returnValue: _FakeCheckRunConclusion_41(
          this,
          Invocation.method(
            #conclusionForResult,
            [status],
          ),
        ),
      ) as _i14.CheckRunConclusion);

  @override
  _i14.CheckRunStatus statusForResult(_i9.Status? status) => (super.noSuchMethod(
        Invocation.method(
          #statusForResult,
          [status],
        ),
        returnValue: _FakeCheckRunStatus_42(
          this,
          Invocation.method(
            #statusForResult,
            [status],
          ),
        ),
      ) as _i14.CheckRunStatus);

  @override
  _i21.Future<_i14.PullRequest?> findMatchingPullRequest(
    _i14.RepositorySlug? slug,
    String? headSha,
    int? checkSuiteId,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #findMatchingPullRequest,
          [
            slug,
            headSha,
            checkSuiteId,
          ],
        ),
        returnValue: _i21.Future<_i14.PullRequest?>.value(),
      ) as _i21.Future<_i14.PullRequest?>);
}

/// A class which mocks [GithubChecksUtil].
///
/// See the documentation for Mockito's code generation for more information.
class MockGithubChecksUtil extends _i1.Mock implements _i25.GithubChecksUtil {
  MockGithubChecksUtil() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i21.Future<Map<String, _i14.CheckRun>> allCheckRuns(
    _i14.GitHub? gitHubClient,
    _i34.CheckSuiteEvent? checkSuiteEvent,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #allCheckRuns,
          [
            gitHubClient,
            checkSuiteEvent,
          ],
        ),
        returnValue: _i21.Future<Map<String, _i14.CheckRun>>.value(<String, _i14.CheckRun>{}),
      ) as _i21.Future<Map<String, _i14.CheckRun>>);

  @override
  _i21.Future<_i14.CheckSuite> getCheckSuite(
    _i14.GitHub? gitHubClient,
    _i14.RepositorySlug? slug,
    int? checkSuiteId,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCheckSuite,
          [
            gitHubClient,
            slug,
            checkSuiteId,
          ],
        ),
        returnValue: _i21.Future<_i14.CheckSuite>.value(_FakeCheckSuite_43(
          this,
          Invocation.method(
            #getCheckSuite,
            [
              gitHubClient,
              slug,
              checkSuiteId,
            ],
          ),
        )),
      ) as _i21.Future<_i14.CheckSuite>);

  @override
  _i21.Future<List<_i14.CheckSuite>> listCheckSuitesForRef(
    _i14.GitHub? gitHubClient,
    _i14.RepositorySlug? slug, {
    required String? ref,
    int? appId,
    String? checkName,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCheckSuitesForRef,
          [
            gitHubClient,
            slug,
          ],
          {
            #ref: ref,
            #appId: appId,
            #checkName: checkName,
          },
        ),
        returnValue: _i21.Future<List<_i14.CheckSuite>>.value(<_i14.CheckSuite>[]),
      ) as _i21.Future<List<_i14.CheckSuite>>);

  @override
  _i21.Future<void> updateCheckRun(
    _i3.Config? config,
    _i14.RepositorySlug? slug,
    _i14.CheckRun? checkRun, {
    _i14.CheckRunStatus? status = _i14.CheckRunStatus.queued,
    _i14.CheckRunConclusion? conclusion,
    String? detailsUrl,
    _i14.CheckRunOutput? output,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCheckRun,
          [
            config,
            slug,
            checkRun,
          ],
          {
            #status: status,
            #conclusion: conclusion,
            #detailsUrl: detailsUrl,
            #output: output,
          },
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<_i14.CheckRun> getCheckRun(
    _i3.Config? config,
    _i14.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCheckRun,
          [
            config,
            slug,
            id,
          ],
        ),
        returnValue: _i21.Future<_i14.CheckRun>.value(_FakeCheckRun_44(
          this,
          Invocation.method(
            #getCheckRun,
            [
              config,
              slug,
              id,
            ],
          ),
        )),
      ) as _i21.Future<_i14.CheckRun>);

  @override
  _i21.Future<_i14.CheckRun> createCheckRun(
    _i3.Config? config,
    _i14.RepositorySlug? slug,
    String? sha,
    String? name, {
    _i14.CheckRunOutput? output,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createCheckRun,
          [
            config,
            slug,
            sha,
            name,
          ],
          {#output: output},
        ),
        returnValue: _i21.Future<_i14.CheckRun>.value(_FakeCheckRun_44(
          this,
          Invocation.method(
            #createCheckRun,
            [
              config,
              slug,
              sha,
              name,
            ],
            {#output: output},
          ),
        )),
      ) as _i21.Future<_i14.CheckRun>);
}

/// A class which mocks [GithubService].
///
/// See the documentation for Mockito's code generation for more information.
class MockGithubService extends _i1.Mock implements _i18.GithubService {
  MockGithubService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i14.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_20(
          this,
          Invocation.getter(#github),
        ),
      ) as _i14.GitHub);

  @override
  _i21.Future<List<_i14.RepositoryCommit>> listBranchedCommits(
    _i14.RepositorySlug? slug,
    String? branch,
    int? lastCommitTimestampMills,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listBranchedCommits,
          [
            slug,
            branch,
            lastCommitTimestampMills,
          ],
        ),
        returnValue: _i21.Future<List<_i14.RepositoryCommit>>.value(<_i14.RepositoryCommit>[]),
      ) as _i21.Future<List<_i14.RepositoryCommit>>);

  @override
  _i21.Future<List<_i14.PullRequest>> listPullRequests(
    _i14.RepositorySlug? slug,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listPullRequests,
          [
            slug,
            branch,
          ],
        ),
        returnValue: _i21.Future<List<_i14.PullRequest>>.value(<_i14.PullRequest>[]),
      ) as _i21.Future<List<_i14.PullRequest>>);

  @override
  _i21.Future<_i14.PullRequest> createPullRequest(
    _i14.RepositorySlug? slug, {
    required String? title,
    String? body,
    String? commitMessage,
    required _i14.GitReference? baseRef,
    List<_i14.CreateGitTreeEntry>? entries,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createPullRequest,
          [slug],
          {
            #title: title,
            #body: body,
            #commitMessage: commitMessage,
            #baseRef: baseRef,
            #entries: entries,
          },
        ),
        returnValue: _i21.Future<_i14.PullRequest>.value(_FakePullRequest_45(
          this,
          Invocation.method(
            #createPullRequest,
            [slug],
            {
              #title: title,
              #body: body,
              #commitMessage: commitMessage,
              #baseRef: baseRef,
              #entries: entries,
            },
          ),
        )),
      ) as _i21.Future<_i14.PullRequest>);

  @override
  _i21.Future<void> assignReviewer(
    _i14.RepositorySlug? slug, {
    int? pullRequestNumber,
    String? reviewer,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #assignReviewer,
          [slug],
          {
            #pullRequestNumber: pullRequestNumber,
            #reviewer: reviewer,
          },
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<List<_i14.IssueLabel>> getIssueLabels(
    _i14.RepositorySlug? slug,
    int? issueNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getIssueLabels,
          [
            slug,
            issueNumber,
          ],
        ),
        returnValue: _i21.Future<List<_i14.IssueLabel>>.value(<_i14.IssueLabel>[]),
      ) as _i21.Future<List<_i14.IssueLabel>>);

  @override
  _i21.Future<List<_i14.IssueLabel>> addIssueLabels(
    _i14.RepositorySlug? slug,
    int? issueNumber,
    List<String>? labels,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #addIssueLabels,
          [
            slug,
            issueNumber,
            labels,
          ],
        ),
        returnValue: _i21.Future<List<_i14.IssueLabel>>.value(<_i14.IssueLabel>[]),
      ) as _i21.Future<List<_i14.IssueLabel>>);

  @override
  _i21.Future<List<_i14.Issue>> listIssues(
    _i14.RepositorySlug? slug, {
    List<String>? labels,
    String? state = r'open',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listIssues,
          [slug],
          {
            #labels: labels,
            #state: state,
          },
        ),
        returnValue: _i21.Future<List<_i14.Issue>>.value(<_i14.Issue>[]),
      ) as _i21.Future<List<_i14.Issue>>);

  @override
  _i21.Future<_i14.Issue>? getIssue(
    _i14.RepositorySlug? slug, {
    required int? issueNumber,
  }) =>
      (super.noSuchMethod(Invocation.method(
        #getIssue,
        [slug],
        {#issueNumber: issueNumber},
      )) as _i21.Future<_i14.Issue>?);

  @override
  _i21.Future<void> assignIssue(
    _i14.RepositorySlug? slug, {
    required int? issueNumber,
    required String? assignee,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #assignIssue,
          [slug],
          {
            #issueNumber: issueNumber,
            #assignee: assignee,
          },
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<_i14.Issue> createIssue(
    _i14.RepositorySlug? slug, {
    String? title,
    String? body,
    List<String>? labels,
    String? assignee,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createIssue,
          [slug],
          {
            #title: title,
            #body: body,
            #labels: labels,
            #assignee: assignee,
          },
        ),
        returnValue: _i21.Future<_i14.Issue>.value(_FakeIssue_36(
          this,
          Invocation.method(
            #createIssue,
            [slug],
            {
              #title: title,
              #body: body,
              #labels: labels,
              #assignee: assignee,
            },
          ),
        )),
      ) as _i21.Future<_i14.Issue>);

  @override
  _i21.Future<_i14.IssueComment?> createComment(
    _i14.RepositorySlug? slug, {
    required int? issueNumber,
    required String? body,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createComment,
          [slug],
          {
            #issueNumber: issueNumber,
            #body: body,
          },
        ),
        returnValue: _i21.Future<_i14.IssueComment?>.value(),
      ) as _i21.Future<_i14.IssueComment?>);

  @override
  _i21.Future<List<_i14.IssueLabel>> replaceLabelsForIssue(
    _i14.RepositorySlug? slug, {
    required int? issueNumber,
    required List<String>? labels,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #replaceLabelsForIssue,
          [slug],
          {
            #issueNumber: issueNumber,
            #labels: labels,
          },
        ),
        returnValue: _i21.Future<List<_i14.IssueLabel>>.value(<_i14.IssueLabel>[]),
      ) as _i21.Future<List<_i14.IssueLabel>>);

  @override
  _i21.Future<List<String>> listFiles(_i14.PullRequest? pullRequest) => (super.noSuchMethod(
        Invocation.method(
          #listFiles,
          [pullRequest],
        ),
        returnValue: _i21.Future<List<String>>.value(<String>[]),
      ) as _i21.Future<List<String>>);

  @override
  _i21.Future<String> getFileContent(
    _i14.RepositorySlug? slug,
    String? path, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getFileContent,
          [
            slug,
            path,
          ],
          {#ref: ref},
        ),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.method(
            #getFileContent,
            [
              slug,
              path,
            ],
            {#ref: ref},
          ),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<_i14.GitReference> getReference(
    _i14.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReference,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i21.Future<_i14.GitReference>.value(_FakeGitReference_46(
          this,
          Invocation.method(
            #getReference,
            [
              slug,
              ref,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitReference>);

  @override
  _i21.Future<_i14.RateLimit> getRateLimit() => (super.noSuchMethod(
        Invocation.method(
          #getRateLimit,
          [],
        ),
        returnValue: _i21.Future<_i14.RateLimit>.value(_FakeRateLimit_47(
          this,
          Invocation.method(
            #getRateLimit,
            [],
          ),
        )),
      ) as _i21.Future<_i14.RateLimit>);

  @override
  _i21.Future<List<_i14.Issue>> searchIssuesAndPRs(
    _i14.RepositorySlug? slug,
    String? query, {
    String? sort,
    int? pages = 2,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #searchIssuesAndPRs,
          [
            slug,
            query,
          ],
          {
            #sort: sort,
            #pages: pages,
          },
        ),
        returnValue: _i21.Future<List<_i14.Issue>>.value(<_i14.Issue>[]),
      ) as _i21.Future<List<_i14.Issue>>);

  @override
  _i21.Future<_i14.PullRequest> getPullRequest(
    _i14.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getPullRequest,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i21.Future<_i14.PullRequest>.value(_FakePullRequest_45(
          this,
          Invocation.method(
            #getPullRequest,
            [
              slug,
              number,
            ],
          ),
        )),
      ) as _i21.Future<_i14.PullRequest>);
}

/// A class which mocks [GitService].
///
/// See the documentation for Mockito's code generation for more information.
class MockGitService extends _i1.Mock implements _i14.GitService {
  MockGitService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i14.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_20(
          this,
          Invocation.getter(#github),
        ),
      ) as _i14.GitHub);

  @override
  _i21.Future<_i14.GitBlob> getBlob(
    _i14.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBlob,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i21.Future<_i14.GitBlob>.value(_FakeGitBlob_48(
          this,
          Invocation.method(
            #getBlob,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitBlob>);

  @override
  _i21.Future<_i14.GitBlob> createBlob(
    _i14.RepositorySlug? slug,
    _i14.CreateGitBlob? blob,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createBlob,
          [
            slug,
            blob,
          ],
        ),
        returnValue: _i21.Future<_i14.GitBlob>.value(_FakeGitBlob_48(
          this,
          Invocation.method(
            #createBlob,
            [
              slug,
              blob,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitBlob>);

  @override
  _i21.Future<_i14.GitCommit> getCommit(
    _i14.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommit,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i21.Future<_i14.GitCommit>.value(_FakeGitCommit_49(
          this,
          Invocation.method(
            #getCommit,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitCommit>);

  @override
  _i21.Future<_i14.GitCommit> createCommit(
    _i14.RepositorySlug? slug,
    _i14.CreateGitCommit? commit,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createCommit,
          [
            slug,
            commit,
          ],
        ),
        returnValue: _i21.Future<_i14.GitCommit>.value(_FakeGitCommit_49(
          this,
          Invocation.method(
            #createCommit,
            [
              slug,
              commit,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitCommit>);

  @override
  _i21.Future<_i14.GitReference> getReference(
    _i14.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReference,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i21.Future<_i14.GitReference>.value(_FakeGitReference_46(
          this,
          Invocation.method(
            #getReference,
            [
              slug,
              ref,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitReference>);

  @override
  _i21.Stream<_i14.GitReference> listReferences(
    _i14.RepositorySlug? slug, {
    String? type,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReferences,
          [slug],
          {#type: type},
        ),
        returnValue: _i21.Stream<_i14.GitReference>.empty(),
      ) as _i21.Stream<_i14.GitReference>);

  @override
  _i21.Future<_i14.GitReference> createReference(
    _i14.RepositorySlug? slug,
    String? ref,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createReference,
          [
            slug,
            ref,
            sha,
          ],
        ),
        returnValue: _i21.Future<_i14.GitReference>.value(_FakeGitReference_46(
          this,
          Invocation.method(
            #createReference,
            [
              slug,
              ref,
              sha,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitReference>);

  @override
  _i21.Future<_i14.GitReference> editReference(
    _i14.RepositorySlug? slug,
    String? ref,
    String? sha, {
    bool? force = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #editReference,
          [
            slug,
            ref,
            sha,
          ],
          {#force: force},
        ),
        returnValue: _i21.Future<_i14.GitReference>.value(_FakeGitReference_46(
          this,
          Invocation.method(
            #editReference,
            [
              slug,
              ref,
              sha,
            ],
            {#force: force},
          ),
        )),
      ) as _i21.Future<_i14.GitReference>);

  @override
  _i21.Future<bool> deleteReference(
    _i14.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteReference,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<_i14.GitTag> getTag(
    _i14.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTag,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i21.Future<_i14.GitTag>.value(_FakeGitTag_50(
          this,
          Invocation.method(
            #getTag,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitTag>);

  @override
  _i21.Future<_i14.GitTag> createTag(
    _i14.RepositorySlug? slug,
    _i14.CreateGitTag? tag,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createTag,
          [
            slug,
            tag,
          ],
        ),
        returnValue: _i21.Future<_i14.GitTag>.value(_FakeGitTag_50(
          this,
          Invocation.method(
            #createTag,
            [
              slug,
              tag,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitTag>);

  @override
  _i21.Future<_i14.GitTree> getTree(
    _i14.RepositorySlug? slug,
    String? sha, {
    bool? recursive = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTree,
          [
            slug,
            sha,
          ],
          {#recursive: recursive},
        ),
        returnValue: _i21.Future<_i14.GitTree>.value(_FakeGitTree_51(
          this,
          Invocation.method(
            #getTree,
            [
              slug,
              sha,
            ],
            {#recursive: recursive},
          ),
        )),
      ) as _i21.Future<_i14.GitTree>);

  @override
  _i21.Future<_i14.GitTree> createTree(
    _i14.RepositorySlug? slug,
    _i14.CreateGitTree? tree,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createTree,
          [
            slug,
            tree,
          ],
        ),
        returnValue: _i21.Future<_i14.GitTree>.value(_FakeGitTree_51(
          this,
          Invocation.method(
            #createTree,
            [
              slug,
              tree,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitTree>);
}

/// A class which mocks [GraphQLClient].
///
/// See the documentation for Mockito's code generation for more information.
class MockGraphQLClient extends _i1.Mock implements _i15.GraphQLClient {
  MockGraphQLClient() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i15.DefaultPolicies get defaultPolicies => (super.noSuchMethod(
        Invocation.getter(#defaultPolicies),
        returnValue: _FakeDefaultPolicies_52(
          this,
          Invocation.getter(#defaultPolicies),
        ),
      ) as _i15.DefaultPolicies);

  @override
  set defaultPolicies(_i15.DefaultPolicies? _defaultPolicies) => super.noSuchMethod(
        Invocation.setter(
          #defaultPolicies,
          _defaultPolicies,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i15.Link get link => (super.noSuchMethod(
        Invocation.getter(#link),
        returnValue: _FakeLink_53(
          this,
          Invocation.getter(#link),
        ),
      ) as _i15.Link);

  @override
  _i15.GraphQLCache get cache => (super.noSuchMethod(
        Invocation.getter(#cache),
        returnValue: _FakeGraphQLCache_54(
          this,
          Invocation.getter(#cache),
        ),
      ) as _i15.GraphQLCache);

  @override
  _i15.QueryManager get queryManager => (super.noSuchMethod(
        Invocation.getter(#queryManager),
        returnValue: _FakeQueryManager_55(
          this,
          Invocation.getter(#queryManager),
        ),
      ) as _i15.QueryManager);

  @override
  set queryManager(_i15.QueryManager? _queryManager) => super.noSuchMethod(
        Invocation.setter(
          #queryManager,
          _queryManager,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i15.GraphQLClient copyWith({
    _i15.Link? link,
    _i15.GraphQLCache? cache,
    _i15.DefaultPolicies? defaultPolicies,
    bool? alwaysRebroadcast,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #copyWith,
          [],
          {
            #link: link,
            #cache: cache,
            #defaultPolicies: defaultPolicies,
            #alwaysRebroadcast: alwaysRebroadcast,
          },
        ),
        returnValue: _FakeGraphQLClient_21(
          this,
          Invocation.method(
            #copyWith,
            [],
            {
              #link: link,
              #cache: cache,
              #defaultPolicies: defaultPolicies,
              #alwaysRebroadcast: alwaysRebroadcast,
            },
          ),
        ),
      ) as _i15.GraphQLClient);

  @override
  _i15.ObservableQuery<TParsed> watchQuery<TParsed>(_i15.WatchQueryOptions<TParsed>? options) => (super.noSuchMethod(
        Invocation.method(
          #watchQuery,
          [options],
        ),
        returnValue: _FakeObservableQuery_56<TParsed>(
          this,
          Invocation.method(
            #watchQuery,
            [options],
          ),
        ),
      ) as _i15.ObservableQuery<TParsed>);

  @override
  _i15.ObservableQuery<TParsed> watchMutation<TParsed>(_i15.WatchQueryOptions<TParsed>? options) => (super.noSuchMethod(
        Invocation.method(
          #watchMutation,
          [options],
        ),
        returnValue: _FakeObservableQuery_56<TParsed>(
          this,
          Invocation.method(
            #watchMutation,
            [options],
          ),
        ),
      ) as _i15.ObservableQuery<TParsed>);

  @override
  _i21.Future<_i15.QueryResult<TParsed>> query<TParsed>(_i15.QueryOptions<TParsed>? options) => (super.noSuchMethod(
        Invocation.method(
          #query,
          [options],
        ),
        returnValue: _i21.Future<_i15.QueryResult<TParsed>>.value(_FakeQueryResult_57<TParsed>(
          this,
          Invocation.method(
            #query,
            [options],
          ),
        )),
      ) as _i21.Future<_i15.QueryResult<TParsed>>);

  @override
  _i21.Future<_i15.QueryResult<TParsed>> mutate<TParsed>(_i15.MutationOptions<TParsed>? options) => (super.noSuchMethod(
        Invocation.method(
          #mutate,
          [options],
        ),
        returnValue: _i21.Future<_i15.QueryResult<TParsed>>.value(_FakeQueryResult_57<TParsed>(
          this,
          Invocation.method(
            #mutate,
            [options],
          ),
        )),
      ) as _i21.Future<_i15.QueryResult<TParsed>>);

  @override
  _i21.Stream<_i15.QueryResult<TParsed>> subscribe<TParsed>(_i15.SubscriptionOptions<TParsed>? options) =>
      (super.noSuchMethod(
        Invocation.method(
          #subscribe,
          [options],
        ),
        returnValue: _i21.Stream<_i15.QueryResult<TParsed>>.empty(),
      ) as _i21.Stream<_i15.QueryResult<TParsed>>);

  @override
  _i21.Future<_i15.QueryResult<TParsed>> fetchMore<TParsed>(
    _i15.FetchMoreOptions? fetchMoreOptions, {
    required _i15.QueryOptions<TParsed>? originalOptions,
    required _i15.QueryResult<TParsed>? previousResult,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #fetchMore,
          [fetchMoreOptions],
          {
            #originalOptions: originalOptions,
            #previousResult: previousResult,
          },
        ),
        returnValue: _i21.Future<_i15.QueryResult<TParsed>>.value(_FakeQueryResult_57<TParsed>(
          this,
          Invocation.method(
            #fetchMore,
            [fetchMoreOptions],
            {
              #originalOptions: originalOptions,
              #previousResult: previousResult,
            },
          ),
        )),
      ) as _i21.Future<_i15.QueryResult<TParsed>>);

  @override
  Map<String, dynamic>? readQuery(
    _i15.Request? request, {
    bool? optimistic = true,
  }) =>
      (super.noSuchMethod(Invocation.method(
        #readQuery,
        [request],
        {#optimistic: optimistic},
      )) as Map<String, dynamic>?);

  @override
  Map<String, dynamic>? readFragment(
    _i15.FragmentRequest? fragmentRequest, {
    bool? optimistic = true,
  }) =>
      (super.noSuchMethod(Invocation.method(
        #readFragment,
        [fragmentRequest],
        {#optimistic: optimistic},
      )) as Map<String, dynamic>?);

  @override
  void writeQuery(
    _i15.Request? request, {
    required Map<String, dynamic>? data,
    bool? broadcast = true,
  }) =>
      super.noSuchMethod(
        Invocation.method(
          #writeQuery,
          [request],
          {
            #data: data,
            #broadcast: broadcast,
          },
        ),
        returnValueForMissingStub: null,
      );

  @override
  void writeFragment(
    _i15.FragmentRequest? fragmentRequest, {
    bool? broadcast = true,
    required Map<String, dynamic>? data,
  }) =>
      super.noSuchMethod(
        Invocation.method(
          #writeFragment,
          [fragmentRequest],
          {
            #broadcast: broadcast,
            #data: data,
          },
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i21.Future<List<_i15.QueryResult<Object?>?>>? resetStore({bool? refetchQueries = true}) =>
      (super.noSuchMethod(Invocation.method(
        #resetStore,
        [],
        {#refetchQueries: refetchQueries},
      )) as _i21.Future<List<_i15.QueryResult<Object?>?>>?);
}

/// A class which mocks [HttpClient].
///
/// See the documentation for Mockito's code generation for more information.
class MockHttpClient extends _i1.Mock implements _i26.HttpClient {
  MockHttpClient() {
    _i1.throwOnMissingStub(this);
  }

  @override
  Duration get idleTimeout => (super.noSuchMethod(
        Invocation.getter(#idleTimeout),
        returnValue: _FakeDuration_19(
          this,
          Invocation.getter(#idleTimeout),
        ),
      ) as Duration);

  @override
  set idleTimeout(Duration? _idleTimeout) => super.noSuchMethod(
        Invocation.setter(
          #idleTimeout,
          _idleTimeout,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set connectionTimeout(Duration? _connectionTimeout) => super.noSuchMethod(
        Invocation.setter(
          #connectionTimeout,
          _connectionTimeout,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set maxConnectionsPerHost(int? _maxConnectionsPerHost) => super.noSuchMethod(
        Invocation.setter(
          #maxConnectionsPerHost,
          _maxConnectionsPerHost,
        ),
        returnValueForMissingStub: null,
      );

  @override
  bool get autoUncompress => (super.noSuchMethod(
        Invocation.getter(#autoUncompress),
        returnValue: false,
      ) as bool);

  @override
  set autoUncompress(bool? _autoUncompress) => super.noSuchMethod(
        Invocation.setter(
          #autoUncompress,
          _autoUncompress,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set userAgent(String? _userAgent) => super.noSuchMethod(
        Invocation.setter(
          #userAgent,
          _userAgent,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set authenticate(
          _i21.Future<bool> Function(
            Uri,
            String,
            String?,
          )? f) =>
      super.noSuchMethod(
        Invocation.setter(
          #authenticate,
          f,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set connectionFactory(
          _i21.Future<_i26.ConnectionTask<_i26.Socket>> Function(
            Uri,
            String?,
            int?,
          )? f) =>
      super.noSuchMethod(
        Invocation.setter(
          #connectionFactory,
          f,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set findProxy(String Function(Uri)? f) => super.noSuchMethod(
        Invocation.setter(
          #findProxy,
          f,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set authenticateProxy(
          _i21.Future<bool> Function(
            String,
            int,
            String,
            String?,
          )? f) =>
      super.noSuchMethod(
        Invocation.setter(
          #authenticateProxy,
          f,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set badCertificateCallback(
          bool Function(
            _i26.X509Certificate,
            String,
            int,
          )? callback) =>
      super.noSuchMethod(
        Invocation.setter(
          #badCertificateCallback,
          callback,
        ),
        returnValueForMissingStub: null,
      );

  @override
  set keyLog(dynamic Function(String)? callback) => super.noSuchMethod(
        Invocation.setter(
          #keyLog,
          callback,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i21.Future<_i26.HttpClientRequest> open(
    String? method,
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #open,
          [
            method,
            host,
            port,
            path,
          ],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #open,
            [
              method,
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> openUrl(
    String? method,
    Uri? url,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #openUrl,
          [
            method,
            url,
          ],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #openUrl,
            [
              method,
              url,
            ],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> get(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #get,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> getUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #getUrl,
          [url],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #getUrl,
            [url],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> post(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #post,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #post,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> postUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #postUrl,
          [url],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #postUrl,
            [url],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> put(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #put,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #put,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> putUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #putUrl,
          [url],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #putUrl,
            [url],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> delete(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #delete,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #delete,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> deleteUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #deleteUrl,
          [url],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #deleteUrl,
            [url],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> patch(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #patch,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #patch,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> patchUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #patchUrl,
          [url],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #patchUrl,
            [url],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> head(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #head,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #head,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  _i21.Future<_i26.HttpClientRequest> headUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #headUrl,
          [url],
        ),
        returnValue: _i21.Future<_i26.HttpClientRequest>.value(_FakeHttpClientRequest_58(
          this,
          Invocation.method(
            #headUrl,
            [url],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientRequest>);

  @override
  void addCredentials(
    Uri? url,
    String? realm,
    _i26.HttpClientCredentials? credentials,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #addCredentials,
          [
            url,
            realm,
            credentials,
          ],
        ),
        returnValueForMissingStub: null,
      );

  @override
  void addProxyCredentials(
    String? host,
    int? port,
    String? realm,
    _i26.HttpClientCredentials? credentials,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #addProxyCredentials,
          [
            host,
            port,
            realm,
            credentials,
          ],
        ),
        returnValueForMissingStub: null,
      );

  @override
  void close({bool? force = false}) => super.noSuchMethod(
        Invocation.method(
          #close,
          [],
          {#force: force},
        ),
        returnValueForMissingStub: null,
      );
}

/// A class which mocks [HttpClientRequest].
///
/// See the documentation for Mockito's code generation for more information.
class MockHttpClientRequest extends _i1.Mock implements _i26.HttpClientRequest {
  MockHttpClientRequest() {
    _i1.throwOnMissingStub(this);
  }

  @override
  bool get persistentConnection => (super.noSuchMethod(
        Invocation.getter(#persistentConnection),
        returnValue: false,
      ) as bool);

  @override
  set persistentConnection(bool? _persistentConnection) => super.noSuchMethod(
        Invocation.setter(
          #persistentConnection,
          _persistentConnection,
        ),
        returnValueForMissingStub: null,
      );

  @override
  bool get followRedirects => (super.noSuchMethod(
        Invocation.getter(#followRedirects),
        returnValue: false,
      ) as bool);

  @override
  set followRedirects(bool? _followRedirects) => super.noSuchMethod(
        Invocation.setter(
          #followRedirects,
          _followRedirects,
        ),
        returnValueForMissingStub: null,
      );

  @override
  int get maxRedirects => (super.noSuchMethod(
        Invocation.getter(#maxRedirects),
        returnValue: 0,
      ) as int);

  @override
  set maxRedirects(int? _maxRedirects) => super.noSuchMethod(
        Invocation.setter(
          #maxRedirects,
          _maxRedirects,
        ),
        returnValueForMissingStub: null,
      );

  @override
  int get contentLength => (super.noSuchMethod(
        Invocation.getter(#contentLength),
        returnValue: 0,
      ) as int);

  @override
  set contentLength(int? _contentLength) => super.noSuchMethod(
        Invocation.setter(
          #contentLength,
          _contentLength,
        ),
        returnValueForMissingStub: null,
      );

  @override
  bool get bufferOutput => (super.noSuchMethod(
        Invocation.getter(#bufferOutput),
        returnValue: false,
      ) as bool);

  @override
  set bufferOutput(bool? _bufferOutput) => super.noSuchMethod(
        Invocation.setter(
          #bufferOutput,
          _bufferOutput,
        ),
        returnValueForMissingStub: null,
      );

  @override
  String get method => (super.noSuchMethod(
        Invocation.getter(#method),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#method),
        ),
      ) as String);

  @override
  Uri get uri => (super.noSuchMethod(
        Invocation.getter(#uri),
        returnValue: _FakeUri_59(
          this,
          Invocation.getter(#uri),
        ),
      ) as Uri);

  @override
  _i26.HttpHeaders get headers => (super.noSuchMethod(
        Invocation.getter(#headers),
        returnValue: _FakeHttpHeaders_60(
          this,
          Invocation.getter(#headers),
        ),
      ) as _i26.HttpHeaders);

  @override
  List<_i26.Cookie> get cookies => (super.noSuchMethod(
        Invocation.getter(#cookies),
        returnValue: <_i26.Cookie>[],
      ) as List<_i26.Cookie>);

  @override
  _i21.Future<_i26.HttpClientResponse> get done => (super.noSuchMethod(
        Invocation.getter(#done),
        returnValue: _i21.Future<_i26.HttpClientResponse>.value(_FakeHttpClientResponse_61(
          this,
          Invocation.getter(#done),
        )),
      ) as _i21.Future<_i26.HttpClientResponse>);

  @override
  _i27.Encoding get encoding => (super.noSuchMethod(
        Invocation.getter(#encoding),
        returnValue: _FakeEncoding_62(
          this,
          Invocation.getter(#encoding),
        ),
      ) as _i27.Encoding);

  @override
  set encoding(_i27.Encoding? _encoding) => super.noSuchMethod(
        Invocation.setter(
          #encoding,
          _encoding,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i21.Future<_i26.HttpClientResponse> close() => (super.noSuchMethod(
        Invocation.method(
          #close,
          [],
        ),
        returnValue: _i21.Future<_i26.HttpClientResponse>.value(_FakeHttpClientResponse_61(
          this,
          Invocation.method(
            #close,
            [],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientResponse>);

  @override
  void abort([
    Object? exception,
    StackTrace? stackTrace,
  ]) =>
      super.noSuchMethod(
        Invocation.method(
          #abort,
          [
            exception,
            stackTrace,
          ],
        ),
        returnValueForMissingStub: null,
      );

  @override
  void add(List<int>? data) => super.noSuchMethod(
        Invocation.method(
          #add,
          [data],
        ),
        returnValueForMissingStub: null,
      );

  @override
  void write(Object? object) => super.noSuchMethod(
        Invocation.method(
          #write,
          [object],
        ),
        returnValueForMissingStub: null,
      );

  @override
  void writeAll(
    Iterable<dynamic>? objects, [
    String? separator = r'',
  ]) =>
      super.noSuchMethod(
        Invocation.method(
          #writeAll,
          [
            objects,
            separator,
          ],
        ),
        returnValueForMissingStub: null,
      );

  @override
  void writeln([Object? object = r'']) => super.noSuchMethod(
        Invocation.method(
          #writeln,
          [object],
        ),
        returnValueForMissingStub: null,
      );

  @override
  void writeCharCode(int? charCode) => super.noSuchMethod(
        Invocation.method(
          #writeCharCode,
          [charCode],
        ),
        returnValueForMissingStub: null,
      );

  @override
  void addError(
    Object? error, [
    StackTrace? stackTrace,
  ]) =>
      super.noSuchMethod(
        Invocation.method(
          #addError,
          [
            error,
            stackTrace,
          ],
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i21.Future<dynamic> addStream(_i21.Stream<List<int>>? stream) => (super.noSuchMethod(
        Invocation.method(
          #addStream,
          [stream],
        ),
        returnValue: _i21.Future<dynamic>.value(),
      ) as _i21.Future<dynamic>);

  @override
  _i21.Future<dynamic> flush() => (super.noSuchMethod(
        Invocation.method(
          #flush,
          [],
        ),
        returnValue: _i21.Future<dynamic>.value(),
      ) as _i21.Future<dynamic>);
}

/// A class which mocks [HttpClientResponse].
///
/// See the documentation for Mockito's code generation for more information.
class MockHttpClientResponse extends _i1.Mock implements _i26.HttpClientResponse {
  MockHttpClientResponse() {
    _i1.throwOnMissingStub(this);
  }

  @override
  int get statusCode => (super.noSuchMethod(
        Invocation.getter(#statusCode),
        returnValue: 0,
      ) as int);

  @override
  String get reasonPhrase => (super.noSuchMethod(
        Invocation.getter(#reasonPhrase),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#reasonPhrase),
        ),
      ) as String);

  @override
  int get contentLength => (super.noSuchMethod(
        Invocation.getter(#contentLength),
        returnValue: 0,
      ) as int);

  @override
  _i26.HttpClientResponseCompressionState get compressionState => (super.noSuchMethod(
        Invocation.getter(#compressionState),
        returnValue: _i26.HttpClientResponseCompressionState.notCompressed,
      ) as _i26.HttpClientResponseCompressionState);

  @override
  bool get persistentConnection => (super.noSuchMethod(
        Invocation.getter(#persistentConnection),
        returnValue: false,
      ) as bool);

  @override
  bool get isRedirect => (super.noSuchMethod(
        Invocation.getter(#isRedirect),
        returnValue: false,
      ) as bool);

  @override
  List<_i26.RedirectInfo> get redirects => (super.noSuchMethod(
        Invocation.getter(#redirects),
        returnValue: <_i26.RedirectInfo>[],
      ) as List<_i26.RedirectInfo>);

  @override
  _i26.HttpHeaders get headers => (super.noSuchMethod(
        Invocation.getter(#headers),
        returnValue: _FakeHttpHeaders_60(
          this,
          Invocation.getter(#headers),
        ),
      ) as _i26.HttpHeaders);

  @override
  List<_i26.Cookie> get cookies => (super.noSuchMethod(
        Invocation.getter(#cookies),
        returnValue: <_i26.Cookie>[],
      ) as List<_i26.Cookie>);

  @override
  bool get isBroadcast => (super.noSuchMethod(
        Invocation.getter(#isBroadcast),
        returnValue: false,
      ) as bool);

  @override
  _i21.Future<int> get length => (super.noSuchMethod(
        Invocation.getter(#length),
        returnValue: _i21.Future<int>.value(0),
      ) as _i21.Future<int>);

  @override
  _i21.Future<bool> get isEmpty => (super.noSuchMethod(
        Invocation.getter(#isEmpty),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<List<int>> get first => (super.noSuchMethod(
        Invocation.getter(#first),
        returnValue: _i21.Future<List<int>>.value(<int>[]),
      ) as _i21.Future<List<int>>);

  @override
  _i21.Future<List<int>> get last => (super.noSuchMethod(
        Invocation.getter(#last),
        returnValue: _i21.Future<List<int>>.value(<int>[]),
      ) as _i21.Future<List<int>>);

  @override
  _i21.Future<List<int>> get single => (super.noSuchMethod(
        Invocation.getter(#single),
        returnValue: _i21.Future<List<int>>.value(<int>[]),
      ) as _i21.Future<List<int>>);

  @override
  _i21.Future<_i26.HttpClientResponse> redirect([
    String? method,
    Uri? url,
    bool? followLoops,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #redirect,
          [
            method,
            url,
            followLoops,
          ],
        ),
        returnValue: _i21.Future<_i26.HttpClientResponse>.value(_FakeHttpClientResponse_61(
          this,
          Invocation.method(
            #redirect,
            [
              method,
              url,
              followLoops,
            ],
          ),
        )),
      ) as _i21.Future<_i26.HttpClientResponse>);

  @override
  _i21.Future<_i26.Socket> detachSocket() => (super.noSuchMethod(
        Invocation.method(
          #detachSocket,
          [],
        ),
        returnValue: _i21.Future<_i26.Socket>.value(_FakeSocket_63(
          this,
          Invocation.method(
            #detachSocket,
            [],
          ),
        )),
      ) as _i21.Future<_i26.Socket>);

  @override
  _i21.Stream<List<int>> asBroadcastStream({
    void Function(_i21.StreamSubscription<List<int>>)? onListen,
    void Function(_i21.StreamSubscription<List<int>>)? onCancel,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #asBroadcastStream,
          [],
          {
            #onListen: onListen,
            #onCancel: onCancel,
          },
        ),
        returnValue: _i21.Stream<List<int>>.empty(),
      ) as _i21.Stream<List<int>>);

  @override
  _i21.StreamSubscription<List<int>> listen(
    void Function(List<int>)? onData, {
    Function? onError,
    void Function()? onDone,
    bool? cancelOnError,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listen,
          [onData],
          {
            #onError: onError,
            #onDone: onDone,
            #cancelOnError: cancelOnError,
          },
        ),
        returnValue: _FakeStreamSubscription_64<List<int>>(
          this,
          Invocation.method(
            #listen,
            [onData],
            {
              #onError: onError,
              #onDone: onDone,
              #cancelOnError: cancelOnError,
            },
          ),
        ),
      ) as _i21.StreamSubscription<List<int>>);

  @override
  _i21.Stream<List<int>> where(bool Function(List<int>)? test) => (super.noSuchMethod(
        Invocation.method(
          #where,
          [test],
        ),
        returnValue: _i21.Stream<List<int>>.empty(),
      ) as _i21.Stream<List<int>>);

  @override
  _i21.Stream<S> map<S>(S Function(List<int>)? convert) => (super.noSuchMethod(
        Invocation.method(
          #map,
          [convert],
        ),
        returnValue: _i21.Stream<S>.empty(),
      ) as _i21.Stream<S>);

  @override
  _i21.Stream<E> asyncMap<E>(_i21.FutureOr<E> Function(List<int>)? convert) => (super.noSuchMethod(
        Invocation.method(
          #asyncMap,
          [convert],
        ),
        returnValue: _i21.Stream<E>.empty(),
      ) as _i21.Stream<E>);

  @override
  _i21.Stream<E> asyncExpand<E>(_i21.Stream<E>? Function(List<int>)? convert) => (super.noSuchMethod(
        Invocation.method(
          #asyncExpand,
          [convert],
        ),
        returnValue: _i21.Stream<E>.empty(),
      ) as _i21.Stream<E>);

  @override
  _i21.Stream<List<int>> handleError(
    Function? onError, {
    bool Function(dynamic)? test,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #handleError,
          [onError],
          {#test: test},
        ),
        returnValue: _i21.Stream<List<int>>.empty(),
      ) as _i21.Stream<List<int>>);

  @override
  _i21.Stream<S> expand<S>(Iterable<S> Function(List<int>)? convert) => (super.noSuchMethod(
        Invocation.method(
          #expand,
          [convert],
        ),
        returnValue: _i21.Stream<S>.empty(),
      ) as _i21.Stream<S>);

  @override
  _i21.Future<dynamic> pipe(_i21.StreamConsumer<List<int>>? streamConsumer) => (super.noSuchMethod(
        Invocation.method(
          #pipe,
          [streamConsumer],
        ),
        returnValue: _i21.Future<dynamic>.value(),
      ) as _i21.Future<dynamic>);

  @override
  _i21.Stream<S> transform<S>(_i21.StreamTransformer<List<int>, S>? streamTransformer) => (super.noSuchMethod(
        Invocation.method(
          #transform,
          [streamTransformer],
        ),
        returnValue: _i21.Stream<S>.empty(),
      ) as _i21.Stream<S>);

  @override
  _i21.Future<List<int>> reduce(
          List<int> Function(
            List<int>,
            List<int>,
          )? combine) =>
      (super.noSuchMethod(
        Invocation.method(
          #reduce,
          [combine],
        ),
        returnValue: _i21.Future<List<int>>.value(<int>[]),
      ) as _i21.Future<List<int>>);

  @override
  _i21.Future<S> fold<S>(
    S? initialValue,
    S Function(
      S,
      List<int>,
    )? combine,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #fold,
          [
            initialValue,
            combine,
          ],
        ),
        returnValue: _i32.ifNotNull(
              _i32.dummyValueOrNull<S>(
                this,
                Invocation.method(
                  #fold,
                  [
                    initialValue,
                    combine,
                  ],
                ),
              ),
              (S v) => _i21.Future<S>.value(v),
            ) ??
            _FakeFuture_27<S>(
              this,
              Invocation.method(
                #fold,
                [
                  initialValue,
                  combine,
                ],
              ),
            ),
      ) as _i21.Future<S>);

  @override
  _i21.Future<String> join([String? separator = r'']) => (super.noSuchMethod(
        Invocation.method(
          #join,
          [separator],
        ),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.method(
            #join,
            [separator],
          ),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<bool> contains(Object? needle) => (super.noSuchMethod(
        Invocation.method(
          #contains,
          [needle],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<void> forEach(void Function(List<int>)? action) => (super.noSuchMethod(
        Invocation.method(
          #forEach,
          [action],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<bool> every(bool Function(List<int>)? test) => (super.noSuchMethod(
        Invocation.method(
          #every,
          [test],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<bool> any(bool Function(List<int>)? test) => (super.noSuchMethod(
        Invocation.method(
          #any,
          [test],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<R> cast<R>() => (super.noSuchMethod(
        Invocation.method(
          #cast,
          [],
        ),
        returnValue: _i21.Stream<R>.empty(),
      ) as _i21.Stream<R>);

  @override
  _i21.Future<List<List<int>>> toList() => (super.noSuchMethod(
        Invocation.method(
          #toList,
          [],
        ),
        returnValue: _i21.Future<List<List<int>>>.value(<List<int>>[]),
      ) as _i21.Future<List<List<int>>>);

  @override
  _i21.Future<Set<List<int>>> toSet() => (super.noSuchMethod(
        Invocation.method(
          #toSet,
          [],
        ),
        returnValue: _i21.Future<Set<List<int>>>.value(<List<int>>{}),
      ) as _i21.Future<Set<List<int>>>);

  @override
  _i21.Future<E> drain<E>([E? futureValue]) => (super.noSuchMethod(
        Invocation.method(
          #drain,
          [futureValue],
        ),
        returnValue: _i32.ifNotNull(
              _i32.dummyValueOrNull<E>(
                this,
                Invocation.method(
                  #drain,
                  [futureValue],
                ),
              ),
              (E v) => _i21.Future<E>.value(v),
            ) ??
            _FakeFuture_27<E>(
              this,
              Invocation.method(
                #drain,
                [futureValue],
              ),
            ),
      ) as _i21.Future<E>);

  @override
  _i21.Stream<List<int>> take(int? count) => (super.noSuchMethod(
        Invocation.method(
          #take,
          [count],
        ),
        returnValue: _i21.Stream<List<int>>.empty(),
      ) as _i21.Stream<List<int>>);

  @override
  _i21.Stream<List<int>> takeWhile(bool Function(List<int>)? test) => (super.noSuchMethod(
        Invocation.method(
          #takeWhile,
          [test],
        ),
        returnValue: _i21.Stream<List<int>>.empty(),
      ) as _i21.Stream<List<int>>);

  @override
  _i21.Stream<List<int>> skip(int? count) => (super.noSuchMethod(
        Invocation.method(
          #skip,
          [count],
        ),
        returnValue: _i21.Stream<List<int>>.empty(),
      ) as _i21.Stream<List<int>>);

  @override
  _i21.Stream<List<int>> skipWhile(bool Function(List<int>)? test) => (super.noSuchMethod(
        Invocation.method(
          #skipWhile,
          [test],
        ),
        returnValue: _i21.Stream<List<int>>.empty(),
      ) as _i21.Stream<List<int>>);

  @override
  _i21.Stream<List<int>> distinct(
          [bool Function(
            List<int>,
            List<int>,
          )? equals]) =>
      (super.noSuchMethod(
        Invocation.method(
          #distinct,
          [equals],
        ),
        returnValue: _i21.Stream<List<int>>.empty(),
      ) as _i21.Stream<List<int>>);

  @override
  _i21.Future<List<int>> firstWhere(
    bool Function(List<int>)? test, {
    List<int> Function()? orElse,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #firstWhere,
          [test],
          {#orElse: orElse},
        ),
        returnValue: _i21.Future<List<int>>.value(<int>[]),
      ) as _i21.Future<List<int>>);

  @override
  _i21.Future<List<int>> lastWhere(
    bool Function(List<int>)? test, {
    List<int> Function()? orElse,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #lastWhere,
          [test],
          {#orElse: orElse},
        ),
        returnValue: _i21.Future<List<int>>.value(<int>[]),
      ) as _i21.Future<List<int>>);

  @override
  _i21.Future<List<int>> singleWhere(
    bool Function(List<int>)? test, {
    List<int> Function()? orElse,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #singleWhere,
          [test],
          {#orElse: orElse},
        ),
        returnValue: _i21.Future<List<int>>.value(<int>[]),
      ) as _i21.Future<List<int>>);

  @override
  _i21.Future<List<int>> elementAt(int? index) => (super.noSuchMethod(
        Invocation.method(
          #elementAt,
          [index],
        ),
        returnValue: _i21.Future<List<int>>.value(<int>[]),
      ) as _i21.Future<List<int>>);

  @override
  _i21.Stream<List<int>> timeout(
    Duration? timeLimit, {
    void Function(_i21.EventSink<List<int>>)? onTimeout,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #timeout,
          [timeLimit],
          {#onTimeout: onTimeout},
        ),
        returnValue: _i21.Stream<List<int>>.empty(),
      ) as _i21.Stream<List<int>>);
}

/// A class which mocks [JobsResource].
///
/// See the documentation for Mockito's code generation for more information.
class MockJobsResource extends _i1.Mock implements _i6.JobsResource {
  MockJobsResource() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i21.Future<_i6.JobCancelResponse> cancel(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #cancel,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i21.Future<_i6.JobCancelResponse>.value(_FakeJobCancelResponse_65(
          this,
          Invocation.method(
            #cancel,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i21.Future<_i6.JobCancelResponse>);

  @override
  _i21.Future<void> delete(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #delete,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<_i6.Job> get(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i21.Future<_i6.Job>.value(_FakeJob_66(
          this,
          Invocation.method(
            #get,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i21.Future<_i6.Job>);

  @override
  _i21.Future<_i6.GetQueryResultsResponse> getQueryResults(
    String? projectId,
    String? jobId, {
    String? location,
    int? maxResults,
    String? pageToken,
    String? startIndex,
    int? timeoutMs,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getQueryResults,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #maxResults: maxResults,
            #pageToken: pageToken,
            #startIndex: startIndex,
            #timeoutMs: timeoutMs,
            #$fields: $fields,
          },
        ),
        returnValue: _i21.Future<_i6.GetQueryResultsResponse>.value(_FakeGetQueryResultsResponse_67(
          this,
          Invocation.method(
            #getQueryResults,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #maxResults: maxResults,
              #pageToken: pageToken,
              #startIndex: startIndex,
              #timeoutMs: timeoutMs,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i21.Future<_i6.GetQueryResultsResponse>);

  @override
  _i21.Future<_i6.Job> insert(
    _i6.Job? request,
    String? projectId, {
    String? $fields,
    _i6.UploadOptions? uploadOptions = _i6.UploadOptions.defaultOptions,
    _i6.Media? uploadMedia,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #insert,
          [
            request,
            projectId,
          ],
          {
            #$fields: $fields,
            #uploadOptions: uploadOptions,
            #uploadMedia: uploadMedia,
          },
        ),
        returnValue: _i21.Future<_i6.Job>.value(_FakeJob_66(
          this,
          Invocation.method(
            #insert,
            [
              request,
              projectId,
            ],
            {
              #$fields: $fields,
              #uploadOptions: uploadOptions,
              #uploadMedia: uploadMedia,
            },
          ),
        )),
      ) as _i21.Future<_i6.Job>);

  @override
  _i21.Future<_i6.JobList> list(
    String? projectId, {
    bool? allUsers,
    String? maxCreationTime,
    int? maxResults,
    String? minCreationTime,
    String? pageToken,
    String? parentJobId,
    String? projection,
    List<String>? stateFilter,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #list,
          [projectId],
          {
            #allUsers: allUsers,
            #maxCreationTime: maxCreationTime,
            #maxResults: maxResults,
            #minCreationTime: minCreationTime,
            #pageToken: pageToken,
            #parentJobId: parentJobId,
            #projection: projection,
            #stateFilter: stateFilter,
            #$fields: $fields,
          },
        ),
        returnValue: _i21.Future<_i6.JobList>.value(_FakeJobList_68(
          this,
          Invocation.method(
            #list,
            [projectId],
            {
              #allUsers: allUsers,
              #maxCreationTime: maxCreationTime,
              #maxResults: maxResults,
              #minCreationTime: minCreationTime,
              #pageToken: pageToken,
              #parentJobId: parentJobId,
              #projection: projection,
              #stateFilter: stateFilter,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i21.Future<_i6.JobList>);

  @override
  _i21.Future<_i6.QueryResponse> query(
    _i6.QueryRequest? request,
    String? projectId, {
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #query,
          [
            request,
            projectId,
          ],
          {#$fields: $fields},
        ),
        returnValue: _i21.Future<_i6.QueryResponse>.value(_FakeQueryResponse_69(
          this,
          Invocation.method(
            #query,
            [
              request,
              projectId,
            ],
            {#$fields: $fields},
          ),
        )),
      ) as _i21.Future<_i6.QueryResponse>);
}

/// A class which mocks [LuciBuildService].
///
/// See the documentation for Mockito's code generation for more information.
class MockLuciBuildService extends _i1.Mock implements _i16.LuciBuildService {
  MockLuciBuildService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i16.BuildBucketClient get buildBucketClient => (super.noSuchMethod(
        Invocation.getter(#buildBucketClient),
        returnValue: _FakeBuildBucketClient_70(
          this,
          Invocation.getter(#buildBucketClient),
        ),
      ) as _i16.BuildBucketClient);

  @override
  set buildBucketClient(_i16.BuildBucketClient? _buildBucketClient) => super.noSuchMethod(
        Invocation.setter(
          #buildBucketClient,
          _buildBucketClient,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i28.BuildBucketV2Client get buildBucketV2Client => (super.noSuchMethod(
        Invocation.getter(#buildBucketV2Client),
        returnValue: _FakeBuildBucketV2Client_71(
          this,
          Invocation.getter(#buildBucketV2Client),
        ),
      ) as _i28.BuildBucketV2Client);

  @override
  set buildBucketV2Client(_i28.BuildBucketV2Client? _buildBucketV2Client) => super.noSuchMethod(
        Invocation.setter(
          #buildBucketV2Client,
          _buildBucketV2Client,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i16.CacheService get cache => (super.noSuchMethod(
        Invocation.getter(#cache),
        returnValue: _FakeCacheService_72(
          this,
          Invocation.getter(#cache),
        ),
      ) as _i16.CacheService);

  @override
  _i3.Config get config => (super.noSuchMethod(
        Invocation.getter(#config),
        returnValue: _FakeConfig_1(
          this,
          Invocation.getter(#config),
        ),
      ) as _i3.Config);

  @override
  set config(_i3.Config? _config) => super.noSuchMethod(
        Invocation.setter(
          #config,
          _config,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i25.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
        Invocation.getter(#githubChecksUtil),
        returnValue: _FakeGithubChecksUtil_40(
          this,
          Invocation.getter(#githubChecksUtil),
        ),
      ) as _i25.GithubChecksUtil);

  @override
  set githubChecksUtil(_i25.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
        Invocation.setter(
          #githubChecksUtil,
          _githubChecksUtil,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i7.GerritService get gerritService => (super.noSuchMethod(
        Invocation.getter(#gerritService),
        returnValue: _FakeGerritService_6(
          this,
          Invocation.getter(#gerritService),
        ),
      ) as _i7.GerritService);

  @override
  set gerritService(_i7.GerritService? _gerritService) => super.noSuchMethod(
        Invocation.setter(
          #gerritService,
          _gerritService,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i16.PubSub get pubsub => (super.noSuchMethod(
        Invocation.getter(#pubsub),
        returnValue: _FakePubSub_73(
          this,
          Invocation.getter(#pubsub),
        ),
      ) as _i16.PubSub);

  @override
  _i21.Future<List<List<_i8.Request>>> shard(
    List<_i8.Request>? requests,
    int? max,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #shard,
          [
            requests,
            max,
          ],
        ),
        returnValue: _i21.Future<List<List<_i8.Request>>>.value(<List<_i8.Request>>[]),
      ) as _i21.Future<List<List<_i8.Request>>>);

  @override
  _i21.Future<Iterable<_i8.Build>> getTryBuilds(
    _i14.RepositorySlug? slug,
    String? sha,
    String? builderName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTryBuilds,
          [
            slug,
            sha,
            builderName,
          ],
        ),
        returnValue: _i21.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
      ) as _i21.Future<Iterable<_i8.Build>>);

  @override
  _i21.Future<Iterable<_i9.Build>> getTryBuildsV2(
    _i14.RepositorySlug? slug,
    String? sha,
    String? builderName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTryBuildsV2,
          [
            slug,
            sha,
            builderName,
          ],
        ),
        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
      ) as _i21.Future<Iterable<_i9.Build>>);

  @override
  _i21.Future<Iterable<_i8.Build>> getTryBuildsByPullRequest(_i14.PullRequest? pullRequest) => (super.noSuchMethod(
        Invocation.method(
          #getTryBuildsByPullRequest,
          [pullRequest],
        ),
        returnValue: _i21.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
      ) as _i21.Future<Iterable<_i8.Build>>);

  @override
  _i21.Future<Iterable<_i9.Build>> getTryBuildsByPullRequestV2(_i14.PullRequest? pullRequest) => (super.noSuchMethod(
        Invocation.method(
          #getTryBuildsByPullRequestV2,
          [pullRequest],
        ),
        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
      ) as _i21.Future<Iterable<_i9.Build>>);

  @override
  _i21.Future<Iterable<_i8.Build>> getProdBuilds(
    _i14.RepositorySlug? slug,
    String? commitSha,
    String? builderName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getProdBuilds,
          [
            slug,
            commitSha,
            builderName,
          ],
        ),
        returnValue: _i21.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
      ) as _i21.Future<Iterable<_i8.Build>>);

  @override
  _i21.Future<Iterable<_i8.Build>> getBuilds(
    _i14.RepositorySlug? slug,
    String? commitSha,
    String? builderName,
    String? bucket,
    Map<String, List<String>>? tags,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuilds,
          [
            slug,
            commitSha,
            builderName,
            bucket,
            tags,
          ],
        ),
        returnValue: _i21.Future<Iterable<_i8.Build>>.value(<_i8.Build>[]),
      ) as _i21.Future<Iterable<_i8.Build>>);

  @override
  _i21.Future<Iterable<_i9.Build>> getBuildsV2(
    _i14.RepositorySlug? slug,
    String? commitSha,
    String? builderName,
    String? bucket,
    List<_i9.StringPair>? tags,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuildsV2,
          [
            slug,
            commitSha,
            builderName,
            bucket,
            tags,
          ],
        ),
        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
      ) as _i21.Future<Iterable<_i9.Build>>);

  @override
  _i21.Future<List<_i47.Target>> scheduleTryBuilds({
    required List<_i47.Target>? targets,
    required _i14.PullRequest? pullRequest,
    _i34.CheckSuiteEvent? checkSuiteEvent,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #scheduleTryBuilds,
          [],
          {
            #targets: targets,
            #pullRequest: pullRequest,
            #checkSuiteEvent: checkSuiteEvent,
          },
        ),
        returnValue: _i21.Future<List<_i47.Target>>.value(<_i47.Target>[]),
      ) as _i21.Future<List<_i47.Target>>);

  @override
  _i21.Future<void> cancelBuilds(
    _i14.PullRequest? pullRequest,
    String? reason,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #cancelBuilds,
          [
            pullRequest,
            reason,
          ],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<void> cancelBuildsV2(
    _i14.PullRequest? pullRequest,
    String? reason,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #cancelBuildsV2,
          [
            pullRequest,
            reason,
          ],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<List<_i8.Build?>> failedBuilds(
    _i14.PullRequest? pullRequest,
    List<_i47.Target>? targets,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #failedBuilds,
          [
            pullRequest,
            targets,
          ],
        ),
        returnValue: _i21.Future<List<_i8.Build?>>.value(<_i8.Build?>[]),
      ) as _i21.Future<List<_i8.Build?>>);

  @override
  _i21.Future<_i8.Build> rescheduleBuild({
    required String? builderName,
    required _i43.BuildPushMessage? buildPushMessage,
    required int? rescheduleAttempt,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #rescheduleBuild,
          [],
          {
            #builderName: builderName,
            #buildPushMessage: buildPushMessage,
            #rescheduleAttempt: rescheduleAttempt,
          },
        ),
        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
          this,
          Invocation.method(
            #rescheduleBuild,
            [],
            {
              #builderName: builderName,
              #buildPushMessage: buildPushMessage,
              #rescheduleAttempt: rescheduleAttempt,
            },
          ),
        )),
      ) as _i21.Future<_i8.Build>);

  @override
  _i21.Future<_i8.Build> reschedulePresubmitBuildUsingCheckRunEvent(_i48.CheckRunEvent? checkRunEvent) =>
      (super.noSuchMethod(
        Invocation.method(
          #reschedulePresubmitBuildUsingCheckRunEvent,
          [checkRunEvent],
        ),
        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
          this,
          Invocation.method(
            #reschedulePresubmitBuildUsingCheckRunEvent,
            [checkRunEvent],
          ),
        )),
      ) as _i21.Future<_i8.Build>);

  @override
  List<String>? extractPrefixedLabels(
    List<_i14.IssueLabel>? issueLabels,
    String? prefix,
  ) =>
      (super.noSuchMethod(Invocation.method(
        #extractPrefixedLabels,
        [
          issueLabels,
          prefix,
        ],
      )) as List<String>?);

  @override
  _i21.Future<_i8.Build> reschedulePostsubmitBuildUsingCheckRunEvent(
    _i48.CheckRunEvent? checkRunEvent, {
    required _i36.Commit? commit,
    required _i37.Task? task,
    required _i47.Target? target,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #reschedulePostsubmitBuildUsingCheckRunEvent,
          [checkRunEvent],
          {
            #commit: commit,
            #task: task,
            #target: target,
          },
        ),
        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
          this,
          Invocation.method(
            #reschedulePostsubmitBuildUsingCheckRunEvent,
            [checkRunEvent],
            {
              #commit: commit,
              #task: task,
              #target: target,
            },
          ),
        )),
      ) as _i21.Future<_i8.Build>);

  @override
  _i21.Future<_i8.Build> getBuildById(
    String? id, {
    String? fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuildById,
          [id],
          {#fields: fields},
        ),
        returnValue: _i21.Future<_i8.Build>.value(_FakeBuild_7(
          this,
          Invocation.method(
            #getBuildById,
            [id],
            {#fields: fields},
          ),
        )),
      ) as _i21.Future<_i8.Build>);

  @override
  _i21.Future<_i9.Build> getBuildByIdV2(
    _i49.Int64? id, {
    _i9.BuildMask? buildMask,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuildByIdV2,
          [id],
          {#buildMask: buildMask},
        ),
        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
          this,
          Invocation.method(
            #getBuildByIdV2,
            [id],
            {#buildMask: buildMask},
          ),
        )),
      ) as _i21.Future<_i9.Build>);

  @override
  _i21.Future<Set<String>> getAvailableBuilderSet({
    String? project = r'flutter',
    String? bucket = r'prod',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getAvailableBuilderSet,
          [],
          {
            #project: project,
            #bucket: bucket,
          },
        ),
        returnValue: _i21.Future<Set<String>>.value(<String>{}),
      ) as _i21.Future<Set<String>>);

  @override
  _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>> schedulePostsubmitBuilds({
    required _i36.Commit? commit,
    required List<_i16.Tuple<_i47.Target, _i37.Task, int>>? toBeScheduled,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #schedulePostsubmitBuilds,
          [],
          {
            #commit: commit,
            #toBeScheduled: toBeScheduled,
          },
        ),
        returnValue: _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>>.value(
            <_i16.Tuple<_i47.Target, _i37.Task, int>>[]),
      ) as _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>>);

  @override
  _i21.Future<void> createPostsubmitCheckRun(
    _i36.Commit? commit,
    _i47.Target? target,
    Map<String, dynamic>? rawUserData,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createPostsubmitCheckRun,
          [
            commit,
            target,
            rawUserData,
          ],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<bool> checkRerunBuilder({
    required _i36.Commit? commit,
    required _i47.Target? target,
    required _i37.Task? task,
    required _i10.DatastoreService? datastore,
    required _i42.Task? taskDocument,
    required _i16.FirestoreService? firestoreService,
    Map<String, List<String>>? tags,
    bool? ignoreChecks = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #checkRerunBuilder,
          [],
          {
            #commit: commit,
            #target: target,
            #task: task,
            #datastore: datastore,
            #taskDocument: taskDocument,
            #firestoreService: firestoreService,
            #tags: tags,
            #ignoreChecks: ignoreChecks,
          },
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);
}

/// A class which mocks [LuciBuildServiceV2].
///
/// See the documentation for Mockito's code generation for more information.
class MockLuciBuildServiceV2 extends _i1.Mock implements _i46.LuciBuildServiceV2 {
  MockLuciBuildServiceV2() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i28.BuildBucketV2Client get buildBucketV2Client => (super.noSuchMethod(
        Invocation.getter(#buildBucketV2Client),
        returnValue: _FakeBuildBucketV2Client_71(
          this,
          Invocation.getter(#buildBucketV2Client),
        ),
      ) as _i28.BuildBucketV2Client);

  @override
  set buildBucketV2Client(_i28.BuildBucketV2Client? _buildBucketV2Client) => super.noSuchMethod(
        Invocation.setter(
          #buildBucketV2Client,
          _buildBucketV2Client,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i16.CacheService get cache => (super.noSuchMethod(
        Invocation.getter(#cache),
        returnValue: _FakeCacheService_72(
          this,
          Invocation.getter(#cache),
        ),
      ) as _i16.CacheService);

  @override
  _i3.Config get config => (super.noSuchMethod(
        Invocation.getter(#config),
        returnValue: _FakeConfig_1(
          this,
          Invocation.getter(#config),
        ),
      ) as _i3.Config);

  @override
  set config(_i3.Config? _config) => super.noSuchMethod(
        Invocation.setter(
          #config,
          _config,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i25.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
        Invocation.getter(#githubChecksUtil),
        returnValue: _FakeGithubChecksUtil_40(
          this,
          Invocation.getter(#githubChecksUtil),
        ),
      ) as _i25.GithubChecksUtil);

  @override
  set githubChecksUtil(_i25.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
        Invocation.setter(
          #githubChecksUtil,
          _githubChecksUtil,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i7.GerritService get gerritService => (super.noSuchMethod(
        Invocation.getter(#gerritService),
        returnValue: _FakeGerritService_6(
          this,
          Invocation.getter(#gerritService),
        ),
      ) as _i7.GerritService);

  @override
  set gerritService(_i7.GerritService? _gerritService) => super.noSuchMethod(
        Invocation.setter(
          #gerritService,
          _gerritService,
        ),
        returnValueForMissingStub: null,
      );

  @override
  _i16.PubSub get pubsub => (super.noSuchMethod(
        Invocation.getter(#pubsub),
        returnValue: _FakePubSub_73(
          this,
          Invocation.getter(#pubsub),
        ),
      ) as _i16.PubSub);

  @override
  _i21.Future<List<List<_i9.BatchRequest_Request>>> shard({
    required List<_i9.BatchRequest_Request>? requests,
    required int? maxShardSize,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #shard,
          [],
          {
            #requests: requests,
            #maxShardSize: maxShardSize,
          },
        ),
        returnValue: _i21.Future<List<List<_i9.BatchRequest_Request>>>.value(<List<_i9.BatchRequest_Request>>[]),
      ) as _i21.Future<List<List<_i9.BatchRequest_Request>>>);

  @override
  _i21.Future<Iterable<_i9.Build>> getTryBuilds({
    required _i14.RepositorySlug? slug,
    required String? sha,
    String? builderName,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTryBuilds,
          [],
          {
            #slug: slug,
            #sha: sha,
            #builderName: builderName,
          },
        ),
        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
      ) as _i21.Future<Iterable<_i9.Build>>);

  @override
  _i21.Future<Iterable<_i9.Build>> getTryBuildsByPullRequest({required _i14.PullRequest? pullRequest}) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTryBuildsByPullRequest,
          [],
          {#pullRequest: pullRequest},
        ),
        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
      ) as _i21.Future<Iterable<_i9.Build>>);

  @override
  _i21.Future<Iterable<_i9.Build>> getProdBuilds({
    required _i14.RepositorySlug? slug,
    required String? commitSha,
    String? builderName,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getProdBuilds,
          [],
          {
            #slug: slug,
            #commitSha: commitSha,
            #builderName: builderName,
          },
        ),
        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
      ) as _i21.Future<Iterable<_i9.Build>>);

  @override
  _i21.Future<Iterable<_i9.Build>> getBuilds({
    required _i14.RepositorySlug? slug,
    required String? commitSha,
    required String? builderName,
    required String? bucket,
    required List<_i9.StringPair>? tags,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuilds,
          [],
          {
            #slug: slug,
            #commitSha: commitSha,
            #builderName: builderName,
            #bucket: bucket,
            #tags: tags,
          },
        ),
        returnValue: _i21.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
      ) as _i21.Future<Iterable<_i9.Build>>);

  @override
  _i21.Future<List<_i47.Target>> scheduleTryBuilds({
    required List<_i47.Target>? targets,
    required _i14.PullRequest? pullRequest,
    _i34.CheckSuiteEvent? checkSuiteEvent,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #scheduleTryBuilds,
          [],
          {
            #targets: targets,
            #pullRequest: pullRequest,
            #checkSuiteEvent: checkSuiteEvent,
          },
        ),
        returnValue: _i21.Future<List<_i47.Target>>.value(<_i47.Target>[]),
      ) as _i21.Future<List<_i47.Target>>);

  @override
  _i21.Future<void> cancelBuilds({
    required _i14.PullRequest? pullRequest,
    required String? reason,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #cancelBuilds,
          [],
          {
            #pullRequest: pullRequest,
            #reason: reason,
          },
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<List<_i9.Build?>> failedBuilds({
    required _i14.PullRequest? pullRequest,
    required List<_i47.Target>? targets,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #failedBuilds,
          [],
          {
            #pullRequest: pullRequest,
            #targets: targets,
          },
        ),
        returnValue: _i21.Future<List<_i9.Build?>>.value(<_i9.Build?>[]),
      ) as _i21.Future<List<_i9.Build?>>);

  @override
  _i21.Future<_i9.Build> rescheduleBuild({
    required String? builderName,
    required _i9.Build? build,
    required int? rescheduleAttempt,
    required Map<String, dynamic>? userDataMap,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #rescheduleBuild,
          [],
          {
            #builderName: builderName,
            #build: build,
            #rescheduleAttempt: rescheduleAttempt,
            #userDataMap: userDataMap,
          },
        ),
        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
          this,
          Invocation.method(
            #rescheduleBuild,
            [],
            {
              #builderName: builderName,
              #build: build,
              #rescheduleAttempt: rescheduleAttempt,
              #userDataMap: userDataMap,
            },
          ),
        )),
      ) as _i21.Future<_i9.Build>);

  @override
  _i21.Future<_i9.Build> reschedulePresubmitBuildUsingCheckRunEvent({required _i48.CheckRunEvent? checkRunEvent}) =>
      (super.noSuchMethod(
        Invocation.method(
          #reschedulePresubmitBuildUsingCheckRunEvent,
          [],
          {#checkRunEvent: checkRunEvent},
        ),
        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
          this,
          Invocation.method(
            #reschedulePresubmitBuildUsingCheckRunEvent,
            [],
            {#checkRunEvent: checkRunEvent},
          ),
        )),
      ) as _i21.Future<_i9.Build>);

  @override
  List<String>? extractPrefixedLabels({
    List<_i14.IssueLabel>? issueLabels,
    required String? prefix,
  }) =>
      (super.noSuchMethod(Invocation.method(
        #extractPrefixedLabels,
        [],
        {
          #issueLabels: issueLabels,
          #prefix: prefix,
        },
      )) as List<String>?);

  @override
  _i21.Future<_i9.Build> reschedulePostsubmitBuildUsingCheckRunEvent(
    _i48.CheckRunEvent? checkRunEvent, {
    required _i36.Commit? commit,
    required _i37.Task? task,
    required _i47.Target? target,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #reschedulePostsubmitBuildUsingCheckRunEvent,
          [checkRunEvent],
          {
            #commit: commit,
            #task: task,
            #target: target,
          },
        ),
        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
          this,
          Invocation.method(
            #reschedulePostsubmitBuildUsingCheckRunEvent,
            [checkRunEvent],
            {
              #commit: commit,
              #task: task,
              #target: target,
            },
          ),
        )),
      ) as _i21.Future<_i9.Build>);

  @override
  _i21.Future<_i9.Build> getBuildById(
    _i49.Int64? id, {
    _i9.BuildMask? buildMask,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuildById,
          [id],
          {#buildMask: buildMask},
        ),
        returnValue: _i21.Future<_i9.Build>.value(_FakeBuild_11(
          this,
          Invocation.method(
            #getBuildById,
            [id],
            {#buildMask: buildMask},
          ),
        )),
      ) as _i21.Future<_i9.Build>);

  @override
  _i21.Future<Set<String>> getAvailableBuilderSet({
    String? project = r'flutter',
    String? bucket = r'prod',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getAvailableBuilderSet,
          [],
          {
            #project: project,
            #bucket: bucket,
          },
        ),
        returnValue: _i21.Future<Set<String>>.value(<String>{}),
      ) as _i21.Future<Set<String>>);

  @override
  _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>> schedulePostsubmitBuilds({
    required _i36.Commit? commit,
    required List<_i16.Tuple<_i47.Target, _i37.Task, int>>? toBeScheduled,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #schedulePostsubmitBuilds,
          [],
          {
            #commit: commit,
            #toBeScheduled: toBeScheduled,
          },
        ),
        returnValue: _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>>.value(
            <_i16.Tuple<_i47.Target, _i37.Task, int>>[]),
      ) as _i21.Future<List<_i16.Tuple<_i47.Target, _i37.Task, int>>>);

  @override
  _i21.Future<void> createPostsubmitCheckRun(
    _i36.Commit? commit,
    _i47.Target? target,
    Map<String, dynamic>? rawUserData,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createPostsubmitCheckRun,
          [
            commit,
            target,
            rawUserData,
          ],
        ),
        returnValue: _i21.Future<void>.value(),
        returnValueForMissingStub: _i21.Future<void>.value(),
      ) as _i21.Future<void>);

  @override
  _i21.Future<bool> checkRerunBuilder({
    required _i36.Commit? commit,
    required _i47.Target? target,
    required _i37.Task? task,
    required _i10.DatastoreService? datastore,
    required _i42.Task? taskDocument,
    required _i16.FirestoreService? firestoreService,
    List<_i9.StringPair>? tags,
    bool? ignoreChecks = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #checkRerunBuilder,
          [],
          {
            #commit: commit,
            #target: target,
            #task: task,
            #datastore: datastore,
            #taskDocument: taskDocument,
            #firestoreService: firestoreService,
            #tags: tags,
            #ignoreChecks: ignoreChecks,
          },
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);
}

/// A class which mocks [ProcessManager].
///
/// See the documentation for Mockito's code generation for more information.
class MockProcessManager extends _i1.Mock implements _i50.ProcessManager {
  MockProcessManager() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i21.Future<_i26.Process> start(
    List<Object>? command, {
    String? workingDirectory,
    Map<String, String>? environment,
    bool? includeParentEnvironment = true,
    bool? runInShell = false,
    _i26.ProcessStartMode? mode = _i26.ProcessStartMode.normal,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #start,
          [command],
          {
            #workingDirectory: workingDirectory,
            #environment: environment,
            #includeParentEnvironment: includeParentEnvironment,
            #runInShell: runInShell,
            #mode: mode,
          },
        ),
        returnValue: _i21.Future<_i26.Process>.value(_FakeProcess_74(
          this,
          Invocation.method(
            #start,
            [command],
            {
              #workingDirectory: workingDirectory,
              #environment: environment,
              #includeParentEnvironment: includeParentEnvironment,
              #runInShell: runInShell,
              #mode: mode,
            },
          ),
        )),
      ) as _i21.Future<_i26.Process>);

  @override
  _i21.Future<_i26.ProcessResult> run(
    List<Object>? command, {
    String? workingDirectory,
    Map<String, String>? environment,
    bool? includeParentEnvironment = true,
    bool? runInShell = false,
    _i27.Encoding? stdoutEncoding = const _i26.SystemEncoding(),
    _i27.Encoding? stderrEncoding = const _i26.SystemEncoding(),
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #run,
          [command],
          {
            #workingDirectory: workingDirectory,
            #environment: environment,
            #includeParentEnvironment: includeParentEnvironment,
            #runInShell: runInShell,
            #stdoutEncoding: stdoutEncoding,
            #stderrEncoding: stderrEncoding,
          },
        ),
        returnValue: _i21.Future<_i26.ProcessResult>.value(_i32.dummyValue<_i26.ProcessResult>(
          this,
          Invocation.method(
            #run,
            [command],
            {
              #workingDirectory: workingDirectory,
              #environment: environment,
              #includeParentEnvironment: includeParentEnvironment,
              #runInShell: runInShell,
              #stdoutEncoding: stdoutEncoding,
              #stderrEncoding: stderrEncoding,
            },
          ),
        )),
      ) as _i21.Future<_i26.ProcessResult>);

  @override
  _i26.ProcessResult runSync(
    List<Object>? command, {
    String? workingDirectory,
    Map<String, String>? environment,
    bool? includeParentEnvironment = true,
    bool? runInShell = false,
    _i27.Encoding? stdoutEncoding = const _i26.SystemEncoding(),
    _i27.Encoding? stderrEncoding = const _i26.SystemEncoding(),
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #runSync,
          [command],
          {
            #workingDirectory: workingDirectory,
            #environment: environment,
            #includeParentEnvironment: includeParentEnvironment,
            #runInShell: runInShell,
            #stdoutEncoding: stdoutEncoding,
            #stderrEncoding: stderrEncoding,
          },
        ),
        returnValue: _i32.dummyValue<_i26.ProcessResult>(
          this,
          Invocation.method(
            #runSync,
            [command],
            {
              #workingDirectory: workingDirectory,
              #environment: environment,
              #includeParentEnvironment: includeParentEnvironment,
              #runInShell: runInShell,
              #stdoutEncoding: stdoutEncoding,
              #stderrEncoding: stderrEncoding,
            },
          ),
        ),
      ) as _i26.ProcessResult);

  @override
  bool canRun(
    dynamic executable, {
    String? workingDirectory,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #canRun,
          [executable],
          {#workingDirectory: workingDirectory},
        ),
        returnValue: false,
      ) as bool);

  @override
  bool killPid(
    int? pid, [
    _i26.ProcessSignal? signal = _i26.ProcessSignal.sigterm,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #killPid,
          [
            pid,
            signal,
          ],
        ),
        returnValue: false,
      ) as bool);
}

/// A class which mocks [PullRequestsService].
///
/// See the documentation for Mockito's code generation for more information.
class MockPullRequestsService extends _i1.Mock implements _i14.PullRequestsService {
  MockPullRequestsService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i14.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_20(
          this,
          Invocation.getter(#github),
        ),
      ) as _i14.GitHub);

  @override
  _i21.Stream<_i14.PullRequest> list(
    _i14.RepositorySlug? slug, {
    int? pages,
    String? base,
    String? direction = r'desc',
    String? head,
    String? sort = r'created',
    String? state = r'open',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #list,
          [slug],
          {
            #pages: pages,
            #base: base,
            #direction: direction,
            #head: head,
            #sort: sort,
            #state: state,
          },
        ),
        returnValue: _i21.Stream<_i14.PullRequest>.empty(),
      ) as _i21.Stream<_i14.PullRequest>);

  @override
  _i21.Future<_i14.PullRequest> get(
    _i14.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i21.Future<_i14.PullRequest>.value(_FakePullRequest_45(
          this,
          Invocation.method(
            #get,
            [
              slug,
              number,
            ],
          ),
        )),
      ) as _i21.Future<_i14.PullRequest>);

  @override
  _i21.Future<_i14.PullRequest> create(
    _i14.RepositorySlug? slug,
    _i14.CreatePullRequest? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #create,
          [
            slug,
            request,
          ],
        ),
        returnValue: _i21.Future<_i14.PullRequest>.value(_FakePullRequest_45(
          this,
          Invocation.method(
            #create,
            [
              slug,
              request,
            ],
          ),
        )),
      ) as _i21.Future<_i14.PullRequest>);

  @override
  _i21.Future<_i14.PullRequest> edit(
    _i14.RepositorySlug? slug,
    int? number, {
    String? title,
    String? body,
    String? state,
    String? base,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #edit,
          [
            slug,
            number,
          ],
          {
            #title: title,
            #body: body,
            #state: state,
            #base: base,
          },
        ),
        returnValue: _i21.Future<_i14.PullRequest>.value(_FakePullRequest_45(
          this,
          Invocation.method(
            #edit,
            [
              slug,
              number,
            ],
            {
              #title: title,
              #body: body,
              #state: state,
              #base: base,
            },
          ),
        )),
      ) as _i21.Future<_i14.PullRequest>);

  @override
  _i21.Stream<_i14.RepositoryCommit> listCommits(
    _i14.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommits,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i21.Stream<_i14.RepositoryCommit>.empty(),
      ) as _i21.Stream<_i14.RepositoryCommit>);

  @override
  _i21.Stream<_i14.PullRequestFile> listFiles(
    _i14.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listFiles,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i21.Stream<_i14.PullRequestFile>.empty(),
      ) as _i21.Stream<_i14.PullRequestFile>);

  @override
  _i21.Stream<_i14.PullRequestReview> listReviews(
    _i14.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReviews,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i21.Stream<_i14.PullRequestReview>.empty(),
      ) as _i21.Stream<_i14.PullRequestReview>);

  @override
  _i21.Future<bool> isMerged(
    _i14.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isMerged,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<_i14.PullRequestMerge> merge(
    _i14.RepositorySlug? slug,
    int? number, {
    String? message,
    _i14.MergeMethod? mergeMethod = _i14.MergeMethod.merge,
    String? requestSha,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #merge,
          [
            slug,
            number,
          ],
          {
            #message: message,
            #mergeMethod: mergeMethod,
            #requestSha: requestSha,
          },
        ),
        returnValue: _i21.Future<_i14.PullRequestMerge>.value(_FakePullRequestMerge_75(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              number,
            ],
            {
              #message: message,
              #mergeMethod: mergeMethod,
              #requestSha: requestSha,
            },
          ),
        )),
      ) as _i21.Future<_i14.PullRequestMerge>);

  @override
  _i21.Stream<_i14.PullRequestComment> listCommentsByPullRequest(
    _i14.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommentsByPullRequest,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i21.Stream<_i14.PullRequestComment>.empty(),
      ) as _i21.Stream<_i14.PullRequestComment>);

  @override
  _i21.Stream<_i14.PullRequestComment> listComments(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listComments,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.PullRequestComment>.empty(),
      ) as _i21.Stream<_i14.PullRequestComment>);

  @override
  _i21.Future<_i14.PullRequestComment> createComment(
    _i14.RepositorySlug? slug,
    int? number,
    _i14.CreatePullRequestComment? comment,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createComment,
          [
            slug,
            number,
            comment,
          ],
        ),
        returnValue: _i21.Future<_i14.PullRequestComment>.value(_FakePullRequestComment_76(
          this,
          Invocation.method(
            #createComment,
            [
              slug,
              number,
              comment,
            ],
          ),
        )),
      ) as _i21.Future<_i14.PullRequestComment>);

  @override
  _i21.Future<_i14.PullRequestReview> createReview(
    _i14.RepositorySlug? slug,
    _i14.CreatePullRequestReview? review,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createReview,
          [
            slug,
            review,
          ],
        ),
        returnValue: _i21.Future<_i14.PullRequestReview>.value(_FakePullRequestReview_77(
          this,
          Invocation.method(
            #createReview,
            [
              slug,
              review,
            ],
          ),
        )),
      ) as _i21.Future<_i14.PullRequestReview>);
}

/// A class which mocks [RepositoriesService].
///
/// See the documentation for Mockito's code generation for more information.
class MockRepositoriesService extends _i1.Mock implements _i14.RepositoriesService {
  MockRepositoriesService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i14.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_20(
          this,
          Invocation.getter(#github),
        ),
      ) as _i14.GitHub);

  @override
  _i21.Stream<_i14.Repository> listRepositories({
    String? type = r'owner',
    String? sort = r'full_name',
    String? direction = r'asc',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listRepositories,
          [],
          {
            #type: type,
            #sort: sort,
            #direction: direction,
          },
        ),
        returnValue: _i21.Stream<_i14.Repository>.empty(),
      ) as _i21.Stream<_i14.Repository>);

  @override
  _i21.Stream<_i14.Repository> listUserRepositories(
    String? user, {
    String? type = r'owner',
    String? sort = r'full_name',
    String? direction = r'asc',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listUserRepositories,
          [user],
          {
            #type: type,
            #sort: sort,
            #direction: direction,
          },
        ),
        returnValue: _i21.Stream<_i14.Repository>.empty(),
      ) as _i21.Stream<_i14.Repository>);

  @override
  _i21.Stream<_i14.Repository> listOrganizationRepositories(
    String? org, {
    String? type = r'all',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listOrganizationRepositories,
          [org],
          {#type: type},
        ),
        returnValue: _i21.Stream<_i14.Repository>.empty(),
      ) as _i21.Stream<_i14.Repository>);

  @override
  _i21.Stream<_i14.Repository> listPublicRepositories({
    int? limit = 50,
    DateTime? since,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listPublicRepositories,
          [],
          {
            #limit: limit,
            #since: since,
          },
        ),
        returnValue: _i21.Stream<_i14.Repository>.empty(),
      ) as _i21.Stream<_i14.Repository>);

  @override
  _i21.Future<_i14.Repository> createRepository(
    _i14.CreateRepository? repository, {
    String? org,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createRepository,
          [repository],
          {#org: org},
        ),
        returnValue: _i21.Future<_i14.Repository>.value(_FakeRepository_78(
          this,
          Invocation.method(
            #createRepository,
            [repository],
            {#org: org},
          ),
        )),
      ) as _i21.Future<_i14.Repository>);

  @override
  _i21.Future<_i14.LicenseDetails> getLicense(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLicense,
          [slug],
        ),
        returnValue: _i21.Future<_i14.LicenseDetails>.value(_FakeLicenseDetails_79(
          this,
          Invocation.method(
            #getLicense,
            [slug],
          ),
        )),
      ) as _i21.Future<_i14.LicenseDetails>);

  @override
  _i21.Future<_i14.Repository> getRepository(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getRepository,
          [slug],
        ),
        returnValue: _i21.Future<_i14.Repository>.value(_FakeRepository_78(
          this,
          Invocation.method(
            #getRepository,
            [slug],
          ),
        )),
      ) as _i21.Future<_i14.Repository>);

  @override
  _i21.Stream<_i14.Repository> getRepositories(List<_i14.RepositorySlug>? slugs) => (super.noSuchMethod(
        Invocation.method(
          #getRepositories,
          [slugs],
        ),
        returnValue: _i21.Stream<_i14.Repository>.empty(),
      ) as _i21.Stream<_i14.Repository>);

  @override
  _i21.Future<_i14.Repository> editRepository(
    _i14.RepositorySlug? slug, {
    String? name,
    String? description,
    String? homepage,
    bool? private,
    bool? hasIssues,
    bool? hasWiki,
    bool? hasDownloads,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #editRepository,
          [slug],
          {
            #name: name,
            #description: description,
            #homepage: homepage,
            #private: private,
            #hasIssues: hasIssues,
            #hasWiki: hasWiki,
            #hasDownloads: hasDownloads,
          },
        ),
        returnValue: _i21.Future<_i14.Repository>.value(_FakeRepository_78(
          this,
          Invocation.method(
            #editRepository,
            [slug],
            {
              #name: name,
              #description: description,
              #homepage: homepage,
              #private: private,
              #hasIssues: hasIssues,
              #hasWiki: hasWiki,
              #hasDownloads: hasDownloads,
            },
          ),
        )),
      ) as _i21.Future<_i14.Repository>);

  @override
  _i21.Future<bool> deleteRepository(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #deleteRepository,
          [slug],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.Contributor> listContributors(
    _i14.RepositorySlug? slug, {
    bool? anon = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listContributors,
          [slug],
          {#anon: anon},
        ),
        returnValue: _i21.Stream<_i14.Contributor>.empty(),
      ) as _i21.Stream<_i14.Contributor>);

  @override
  _i21.Stream<_i14.Team> listTeams(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listTeams,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.Team>.empty(),
      ) as _i21.Stream<_i14.Team>);

  @override
  _i21.Future<_i14.LanguageBreakdown> listLanguages(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listLanguages,
          [slug],
        ),
        returnValue: _i21.Future<_i14.LanguageBreakdown>.value(_FakeLanguageBreakdown_80(
          this,
          Invocation.method(
            #listLanguages,
            [slug],
          ),
        )),
      ) as _i21.Future<_i14.LanguageBreakdown>);

  @override
  _i21.Stream<_i14.Tag> listTags(
    _i14.RepositorySlug? slug, {
    int? page = 1,
    int? pages,
    int? perPage = 30,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listTags,
          [slug],
          {
            #page: page,
            #pages: pages,
            #perPage: perPage,
          },
        ),
        returnValue: _i21.Stream<_i14.Tag>.empty(),
      ) as _i21.Stream<_i14.Tag>);

  @override
  _i21.Stream<_i14.Branch> listBranches(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listBranches,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.Branch>.empty(),
      ) as _i21.Stream<_i14.Branch>);

  @override
  _i21.Future<_i14.Branch> getBranch(
    _i14.RepositorySlug? slug,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBranch,
          [
            slug,
            branch,
          ],
        ),
        returnValue: _i21.Future<_i14.Branch>.value(_FakeBranch_81(
          this,
          Invocation.method(
            #getBranch,
            [
              slug,
              branch,
            ],
          ),
        )),
      ) as _i21.Future<_i14.Branch>);

  @override
  _i21.Stream<_i14.Collaborator> listCollaborators(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCollaborators,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.Collaborator>.empty(),
      ) as _i21.Stream<_i14.Collaborator>);

  @override
  _i21.Future<bool> isCollaborator(
    _i14.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<bool> addCollaborator(
    _i14.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #addCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<bool> removeCollaborator(
    _i14.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.CommitComment> listSingleCommitComments(
    _i14.RepositorySlug? slug,
    _i14.RepositoryCommit? commit,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listSingleCommitComments,
          [
            slug,
            commit,
          ],
        ),
        returnValue: _i21.Stream<_i14.CommitComment>.empty(),
      ) as _i21.Stream<_i14.CommitComment>);

  @override
  _i21.Stream<_i14.CommitComment> listCommitComments(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommitComments,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.CommitComment>.empty(),
      ) as _i21.Stream<_i14.CommitComment>);

  @override
  _i21.Future<_i14.CommitComment> createCommitComment(
    _i14.RepositorySlug? slug,
    _i14.RepositoryCommit? commit, {
    required String? body,
    String? path,
    int? position,
    int? line,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createCommitComment,
          [
            slug,
            commit,
          ],
          {
            #body: body,
            #path: path,
            #position: position,
            #line: line,
          },
        ),
        returnValue: _i21.Future<_i14.CommitComment>.value(_FakeCommitComment_82(
          this,
          Invocation.method(
            #createCommitComment,
            [
              slug,
              commit,
            ],
            {
              #body: body,
              #path: path,
              #position: position,
              #line: line,
            },
          ),
        )),
      ) as _i21.Future<_i14.CommitComment>);

  @override
  _i21.Future<_i14.CommitComment> getCommitComment(
    _i14.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i21.Future<_i14.CommitComment>.value(_FakeCommitComment_82(
          this,
          Invocation.method(
            #getCommitComment,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i21.Future<_i14.CommitComment>);

  @override
  _i21.Future<_i14.CommitComment> updateCommitComment(
    _i14.RepositorySlug? slug, {
    required int? id,
    required String? body,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCommitComment,
          [slug],
          {
            #id: id,
            #body: body,
          },
        ),
        returnValue: _i21.Future<_i14.CommitComment>.value(_FakeCommitComment_82(
          this,
          Invocation.method(
            #updateCommitComment,
            [slug],
            {
              #id: id,
              #body: body,
            },
          ),
        )),
      ) as _i21.Future<_i14.CommitComment>);

  @override
  _i21.Future<bool> deleteCommitComment(
    _i14.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.RepositoryCommit> listCommits(
    _i14.RepositorySlug? slug, {
    String? sha,
    String? path,
    String? author,
    String? committer,
    DateTime? since,
    DateTime? until,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommits,
          [slug],
          {
            #sha: sha,
            #path: path,
            #author: author,
            #committer: committer,
            #since: since,
            #until: until,
          },
        ),
        returnValue: _i21.Stream<_i14.RepositoryCommit>.empty(),
      ) as _i21.Stream<_i14.RepositoryCommit>);

  @override
  _i21.Future<_i14.RepositoryCommit> getCommit(
    _i14.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommit,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i21.Future<_i14.RepositoryCommit>.value(_FakeRepositoryCommit_83(
          this,
          Invocation.method(
            #getCommit,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i21.Future<_i14.RepositoryCommit>);

  @override
  _i21.Future<String> getCommitDiff(
    _i14.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitDiff,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i21.Future<String>.value(_i32.dummyValue<String>(
          this,
          Invocation.method(
            #getCommitDiff,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i21.Future<String>);

  @override
  _i21.Future<_i14.GitHubComparison> compareCommits(
    _i14.RepositorySlug? slug,
    String? refBase,
    String? refHead,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #compareCommits,
          [
            slug,
            refBase,
            refHead,
          ],
        ),
        returnValue: _i21.Future<_i14.GitHubComparison>.value(_FakeGitHubComparison_84(
          this,
          Invocation.method(
            #compareCommits,
            [
              slug,
              refBase,
              refHead,
            ],
          ),
        )),
      ) as _i21.Future<_i14.GitHubComparison>);

  @override
  _i21.Future<_i14.GitHubFile> getReadme(
    _i14.RepositorySlug? slug, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReadme,
          [slug],
          {#ref: ref},
        ),
        returnValue: _i21.Future<_i14.GitHubFile>.value(_FakeGitHubFile_85(
          this,
          Invocation.method(
            #getReadme,
            [slug],
            {#ref: ref},
          ),
        )),
      ) as _i21.Future<_i14.GitHubFile>);

  @override
  _i21.Future<_i14.RepositoryContents> getContents(
    _i14.RepositorySlug? slug,
    String? path, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getContents,
          [
            slug,
            path,
          ],
          {#ref: ref},
        ),
        returnValue: _i21.Future<_i14.RepositoryContents>.value(_FakeRepositoryContents_86(
          this,
          Invocation.method(
            #getContents,
            [
              slug,
              path,
            ],
            {#ref: ref},
          ),
        )),
      ) as _i21.Future<_i14.RepositoryContents>);

  @override
  _i21.Future<_i14.ContentCreation> createFile(
    _i14.RepositorySlug? slug,
    _i14.CreateFile? file,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFile,
          [
            slug,
            file,
          ],
        ),
        returnValue: _i21.Future<_i14.ContentCreation>.value(_FakeContentCreation_87(
          this,
          Invocation.method(
            #createFile,
            [
              slug,
              file,
            ],
          ),
        )),
      ) as _i21.Future<_i14.ContentCreation>);

  @override
  _i21.Future<_i14.ContentCreation> updateFile(
    _i14.RepositorySlug? slug,
    String? path,
    String? message,
    String? content,
    String? sha, {
    String? branch,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateFile,
          [
            slug,
            path,
            message,
            content,
            sha,
          ],
          {#branch: branch},
        ),
        returnValue: _i21.Future<_i14.ContentCreation>.value(_FakeContentCreation_87(
          this,
          Invocation.method(
            #updateFile,
            [
              slug,
              path,
              message,
              content,
              sha,
            ],
            {#branch: branch},
          ),
        )),
      ) as _i21.Future<_i14.ContentCreation>);

  @override
  _i21.Future<_i14.ContentCreation> deleteFile(
    _i14.RepositorySlug? slug,
    String? path,
    String? message,
    String? sha,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteFile,
          [
            slug,
            path,
            message,
            sha,
            branch,
          ],
        ),
        returnValue: _i21.Future<_i14.ContentCreation>.value(_FakeContentCreation_87(
          this,
          Invocation.method(
            #deleteFile,
            [
              slug,
              path,
              message,
              sha,
              branch,
            ],
          ),
        )),
      ) as _i21.Future<_i14.ContentCreation>);

  @override
  _i21.Future<String?> getArchiveLink(
    _i14.RepositorySlug? slug,
    String? ref, {
    String? format = r'tarball',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getArchiveLink,
          [
            slug,
            ref,
          ],
          {#format: format},
        ),
        returnValue: _i21.Future<String?>.value(),
      ) as _i21.Future<String?>);

  @override
  _i21.Stream<_i14.Repository> listForks(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listForks,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.Repository>.empty(),
      ) as _i21.Stream<_i14.Repository>);

  @override
  _i21.Future<_i14.Repository> createFork(
    _i14.RepositorySlug? slug, [
    _i14.CreateFork? fork,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFork,
          [
            slug,
            fork,
          ],
        ),
        returnValue: _i21.Future<_i14.Repository>.value(_FakeRepository_78(
          this,
          Invocation.method(
            #createFork,
            [
              slug,
              fork,
            ],
          ),
        )),
      ) as _i21.Future<_i14.Repository>);

  @override
  _i21.Stream<_i14.Hook> listHooks(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listHooks,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.Hook>.empty(),
      ) as _i21.Stream<_i14.Hook>);

  @override
  _i21.Future<_i14.Hook> getHook(
    _i14.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i21.Future<_i14.Hook>.value(_FakeHook_88(
          this,
          Invocation.method(
            #getHook,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i21.Future<_i14.Hook>);

  @override
  _i21.Future<_i14.Hook> createHook(
    _i14.RepositorySlug? slug,
    _i14.CreateHook? hook,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createHook,
          [
            slug,
            hook,
          ],
        ),
        returnValue: _i21.Future<_i14.Hook>.value(_FakeHook_88(
          this,
          Invocation.method(
            #createHook,
            [
              slug,
              hook,
            ],
          ),
        )),
      ) as _i21.Future<_i14.Hook>);

  @override
  _i21.Future<_i14.Hook> editHook(
    _i14.RepositorySlug? slug,
    _i14.Hook? hookToEdit, {
    String? configUrl,
    String? configContentType,
    String? configSecret,
    bool? configInsecureSsl,
    List<String>? events,
    List<String>? addEvents,
    List<String>? removeEvents,
    bool? active,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #editHook,
          [
            slug,
            hookToEdit,
          ],
          {
            #configUrl: configUrl,
            #configContentType: configContentType,
            #configSecret: configSecret,
            #configInsecureSsl: configInsecureSsl,
            #events: events,
            #addEvents: addEvents,
            #removeEvents: removeEvents,
            #active: active,
          },
        ),
        returnValue: _i21.Future<_i14.Hook>.value(_FakeHook_88(
          this,
          Invocation.method(
            #editHook,
            [
              slug,
              hookToEdit,
            ],
            {
              #configUrl: configUrl,
              #configContentType: configContentType,
              #configSecret: configSecret,
              #configInsecureSsl: configInsecureSsl,
              #events: events,
              #addEvents: addEvents,
              #removeEvents: removeEvents,
              #active: active,
            },
          ),
        )),
      ) as _i21.Future<_i14.Hook>);

  @override
  _i21.Future<bool> testPushHook(
    _i14.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #testPushHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<bool> pingHook(
    _i14.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #pingHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<bool> deleteHook(
    _i14.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.PublicKey> listDeployKeys(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listDeployKeys,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.PublicKey>.empty(),
      ) as _i21.Stream<_i14.PublicKey>);

  @override
  _i21.Future<_i14.PublicKey> getDeployKey(
    _i14.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getDeployKey,
          [slug],
          {#id: id},
        ),
        returnValue: _i21.Future<_i14.PublicKey>.value(_FakePublicKey_89(
          this,
          Invocation.method(
            #getDeployKey,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i21.Future<_i14.PublicKey>);

  @override
  _i21.Future<_i14.PublicKey> createDeployKey(
    _i14.RepositorySlug? slug,
    _i14.CreatePublicKey? key,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createDeployKey,
          [
            slug,
            key,
          ],
        ),
        returnValue: _i21.Future<_i14.PublicKey>.value(_FakePublicKey_89(
          this,
          Invocation.method(
            #createDeployKey,
            [
              slug,
              key,
            ],
          ),
        )),
      ) as _i21.Future<_i14.PublicKey>);

  @override
  _i21.Future<bool> deleteDeployKey({
    required _i14.RepositorySlug? slug,
    required _i14.PublicKey? key,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteDeployKey,
          [],
          {
            #slug: slug,
            #key: key,
          },
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<_i14.RepositoryCommit> merge(
    _i14.RepositorySlug? slug,
    _i14.CreateMerge? merge,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #merge,
          [
            slug,
            merge,
          ],
        ),
        returnValue: _i21.Future<_i14.RepositoryCommit>.value(_FakeRepositoryCommit_83(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              merge,
            ],
          ),
        )),
      ) as _i21.Future<_i14.RepositoryCommit>);

  @override
  _i21.Future<_i14.RepositoryPages> getPagesInfo(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getPagesInfo,
          [slug],
        ),
        returnValue: _i21.Future<_i14.RepositoryPages>.value(_FakeRepositoryPages_90(
          this,
          Invocation.method(
            #getPagesInfo,
            [slug],
          ),
        )),
      ) as _i21.Future<_i14.RepositoryPages>);

  @override
  _i21.Stream<_i14.PageBuild> listPagesBuilds(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listPagesBuilds,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.PageBuild>.empty(),
      ) as _i21.Stream<_i14.PageBuild>);

  @override
  _i21.Future<_i14.PageBuild> getLatestPagesBuild(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLatestPagesBuild,
          [slug],
        ),
        returnValue: _i21.Future<_i14.PageBuild>.value(_FakePageBuild_91(
          this,
          Invocation.method(
            #getLatestPagesBuild,
            [slug],
          ),
        )),
      ) as _i21.Future<_i14.PageBuild>);

  @override
  _i21.Stream<_i14.Release> listReleases(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listReleases,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.Release>.empty(),
      ) as _i21.Stream<_i14.Release>);

  @override
  _i21.Future<_i14.Release> getLatestRelease(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLatestRelease,
          [slug],
        ),
        returnValue: _i21.Future<_i14.Release>.value(_FakeRelease_92(
          this,
          Invocation.method(
            #getLatestRelease,
            [slug],
          ),
        )),
      ) as _i21.Future<_i14.Release>);

  @override
  _i21.Future<_i14.Release> getReleaseById(
    _i14.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseById,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i21.Future<_i14.Release>.value(_FakeRelease_92(
          this,
          Invocation.method(
            #getReleaseById,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i21.Future<_i14.Release>);

  @override
  _i21.Future<_i14.Release> getReleaseByTagName(
    _i14.RepositorySlug? slug,
    String? tagName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseByTagName,
          [
            slug,
            tagName,
          ],
        ),
        returnValue: _i21.Future<_i14.Release>.value(_FakeRelease_92(
          this,
          Invocation.method(
            #getReleaseByTagName,
            [
              slug,
              tagName,
            ],
          ),
        )),
      ) as _i21.Future<_i14.Release>);

  @override
  _i21.Future<_i14.Release> createRelease(
    _i14.RepositorySlug? slug,
    _i14.CreateRelease? createRelease, {
    bool? getIfExists = true,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createRelease,
          [
            slug,
            createRelease,
          ],
          {#getIfExists: getIfExists},
        ),
        returnValue: _i21.Future<_i14.Release>.value(_FakeRelease_92(
          this,
          Invocation.method(
            #createRelease,
            [
              slug,
              createRelease,
            ],
            {#getIfExists: getIfExists},
          ),
        )),
      ) as _i21.Future<_i14.Release>);

  @override
  _i21.Future<_i14.Release> editRelease(
    _i14.RepositorySlug? slug,
    _i14.Release? releaseToEdit, {
    String? tagName,
    String? targetCommitish,
    String? name,
    String? body,
    bool? draft,
    bool? preRelease,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #editRelease,
          [
            slug,
            releaseToEdit,
          ],
          {
            #tagName: tagName,
            #targetCommitish: targetCommitish,
            #name: name,
            #body: body,
            #draft: draft,
            #preRelease: preRelease,
          },
        ),
        returnValue: _i21.Future<_i14.Release>.value(_FakeRelease_92(
          this,
          Invocation.method(
            #editRelease,
            [
              slug,
              releaseToEdit,
            ],
            {
              #tagName: tagName,
              #targetCommitish: targetCommitish,
              #name: name,
              #body: body,
              #draft: draft,
              #preRelease: preRelease,
            },
          ),
        )),
      ) as _i21.Future<_i14.Release>);

  @override
  _i21.Future<bool> deleteRelease(
    _i14.RepositorySlug? slug,
    _i14.Release? release,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteRelease,
          [
            slug,
            release,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.ReleaseAsset> listReleaseAssets(
    _i14.RepositorySlug? slug,
    _i14.Release? release,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReleaseAssets,
          [
            slug,
            release,
          ],
        ),
        returnValue: _i21.Stream<_i14.ReleaseAsset>.empty(),
      ) as _i21.Stream<_i14.ReleaseAsset>);

  @override
  _i21.Future<_i14.ReleaseAsset> getReleaseAsset(
    _i14.RepositorySlug? slug,
    _i14.Release? release, {
    required int? assetId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseAsset,
          [
            slug,
            release,
          ],
          {#assetId: assetId},
        ),
        returnValue: _i21.Future<_i14.ReleaseAsset>.value(_FakeReleaseAsset_93(
          this,
          Invocation.method(
            #getReleaseAsset,
            [
              slug,
              release,
            ],
            {#assetId: assetId},
          ),
        )),
      ) as _i21.Future<_i14.ReleaseAsset>);

  @override
  _i21.Future<_i14.ReleaseAsset> editReleaseAsset(
    _i14.RepositorySlug? slug,
    _i14.ReleaseAsset? assetToEdit, {
    String? name,
    String? label,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #editReleaseAsset,
          [
            slug,
            assetToEdit,
          ],
          {
            #name: name,
            #label: label,
          },
        ),
        returnValue: _i21.Future<_i14.ReleaseAsset>.value(_FakeReleaseAsset_93(
          this,
          Invocation.method(
            #editReleaseAsset,
            [
              slug,
              assetToEdit,
            ],
            {
              #name: name,
              #label: label,
            },
          ),
        )),
      ) as _i21.Future<_i14.ReleaseAsset>);

  @override
  _i21.Future<bool> deleteReleaseAsset(
    _i14.RepositorySlug? slug,
    _i14.ReleaseAsset? asset,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteReleaseAsset,
          [
            slug,
            asset,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<List<_i14.ReleaseAsset>> uploadReleaseAssets(
    _i14.Release? release,
    Iterable<_i14.CreateReleaseAsset>? createReleaseAssets,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #uploadReleaseAssets,
          [
            release,
            createReleaseAssets,
          ],
        ),
        returnValue: _i21.Future<List<_i14.ReleaseAsset>>.value(<_i14.ReleaseAsset>[]),
      ) as _i21.Future<List<_i14.ReleaseAsset>>);

  @override
  _i21.Future<List<_i14.ContributorStatistics>> listContributorStats(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listContributorStats,
          [slug],
        ),
        returnValue: _i21.Future<List<_i14.ContributorStatistics>>.value(<_i14.ContributorStatistics>[]),
      ) as _i21.Future<List<_i14.ContributorStatistics>>);

  @override
  _i21.Stream<_i14.YearCommitCountWeek> listCommitActivity(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommitActivity,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.YearCommitCountWeek>.empty(),
      ) as _i21.Stream<_i14.YearCommitCountWeek>);

  @override
  _i21.Stream<_i14.WeeklyChangesCount> listCodeFrequency(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCodeFrequency,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.WeeklyChangesCount>.empty(),
      ) as _i21.Stream<_i14.WeeklyChangesCount>);

  @override
  _i21.Future<_i14.ContributorParticipation> getParticipation(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getParticipation,
          [slug],
        ),
        returnValue: _i21.Future<_i14.ContributorParticipation>.value(_FakeContributorParticipation_94(
          this,
          Invocation.method(
            #getParticipation,
            [slug],
          ),
        )),
      ) as _i21.Future<_i14.ContributorParticipation>);

  @override
  _i21.Stream<_i14.PunchcardEntry> listPunchcard(_i14.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listPunchcard,
          [slug],
        ),
        returnValue: _i21.Stream<_i14.PunchcardEntry>.empty(),
      ) as _i21.Stream<_i14.PunchcardEntry>);

  @override
  _i21.Stream<_i14.RepositoryStatus> listStatuses(
    _i14.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listStatuses,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i21.Stream<_i14.RepositoryStatus>.empty(),
      ) as _i21.Stream<_i14.RepositoryStatus>);

  @override
  _i21.Future<_i14.RepositoryStatus> createStatus(
    _i14.RepositorySlug? slug,
    String? ref,
    _i14.CreateStatus? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createStatus,
          [
            slug,
            ref,
            request,
          ],
        ),
        returnValue: _i21.Future<_i14.RepositoryStatus>.value(_FakeRepositoryStatus_95(
          this,
          Invocation.method(
            #createStatus,
            [
              slug,
              ref,
              request,
            ],
          ),
        )),
      ) as _i21.Future<_i14.RepositoryStatus>);

  @override
  _i21.Future<_i14.CombinedRepositoryStatus> getCombinedStatus(
    _i14.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCombinedStatus,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i21.Future<_i14.CombinedRepositoryStatus>.value(_FakeCombinedRepositoryStatus_96(
          this,
          Invocation.method(
            #getCombinedStatus,
            [
              slug,
              ref,
            ],
          ),
        )),
      ) as _i21.Future<_i14.CombinedRepositoryStatus>);

  @override
  _i21.Future<_i14.ReleaseNotes> generateReleaseNotes(_i14.CreateReleaseNotes? crn) => (super.noSuchMethod(
        Invocation.method(
          #generateReleaseNotes,
          [crn],
        ),
        returnValue: _i21.Future<_i14.ReleaseNotes>.value(_FakeReleaseNotes_97(
          this,
          Invocation.method(
            #generateReleaseNotes,
            [crn],
          ),
        )),
      ) as _i21.Future<_i14.ReleaseNotes>);
}

/// A class which mocks [SearchService].
///
/// See the documentation for Mockito's code generation for more information.
class MockSearchService extends _i1.Mock implements _i14.SearchService {
  MockSearchService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i14.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_20(
          this,
          Invocation.getter(#github),
        ),
      ) as _i14.GitHub);

  @override
  _i21.Stream<_i14.Repository> repositories(
    String? query, {
    String? sort,
    int? pages = 2,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #repositories,
          [query],
          {
            #sort: sort,
            #pages: pages,
          },
        ),
        returnValue: _i21.Stream<_i14.Repository>.empty(),
      ) as _i21.Stream<_i14.Repository>);

  @override
  _i21.Stream<_i14.CodeSearchResults> code(
    String? query, {
    int? pages,
    int? perPage,
    String? language,
    String? filename,
    String? extension,
    String? user,
    String? org,
    String? repo,
    String? fork,
    String? path,
    String? size,
    bool? inFile = true,
    bool? inPath = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #code,
          [query],
          {
            #pages: pages,
            #perPage: perPage,
            #language: language,
            #filename: filename,
            #extension: extension,
            #user: user,
            #org: org,
            #repo: repo,
            #fork: fork,
            #path: path,
            #size: size,
            #inFile: inFile,
            #inPath: inPath,
          },
        ),
        returnValue: _i21.Stream<_i14.CodeSearchResults>.empty(),
      ) as _i21.Stream<_i14.CodeSearchResults>);

  @override
  _i21.Stream<_i14.Issue> issues(
    String? query, {
    String? sort,
    int? pages = 2,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #issues,
          [query],
          {
            #sort: sort,
            #pages: pages,
          },
        ),
        returnValue: _i21.Stream<_i14.Issue>.empty(),
      ) as _i21.Stream<_i14.Issue>);

  @override
  _i21.Stream<_i14.User> users(
    String? query, {
    String? sort,
    int? pages = 2,
    int? perPage = 30,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #users,
          [query],
          {
            #sort: sort,
            #pages: pages,
            #perPage: perPage,
          },
        ),
        returnValue: _i21.Stream<_i14.User>.empty(),
      ) as _i21.Stream<_i14.User>);
}

/// A class which mocks [TabledataResource].
///
/// See the documentation for Mockito's code generation for more information.
class MockTabledataResource extends _i1.Mock implements _i6.TabledataResource {
  MockTabledataResource() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i21.Future<_i6.TableDataInsertAllResponse> insertAll(
    _i6.TableDataInsertAllRequest? request,
    String? projectId,
    String? datasetId,
    String? tableId, {
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #insertAll,
          [
            request,
            projectId,
            datasetId,
            tableId,
          ],
          {#$fields: $fields},
        ),
        returnValue: _i21.Future<_i6.TableDataInsertAllResponse>.value(_FakeTableDataInsertAllResponse_98(
          this,
          Invocation.method(
            #insertAll,
            [
              request,
              projectId,
              datasetId,
              tableId,
            ],
            {#$fields: $fields},
          ),
        )),
      ) as _i21.Future<_i6.TableDataInsertAllResponse>);

  @override
  _i21.Future<_i6.TableDataList> list(
    String? projectId,
    String? datasetId,
    String? tableId, {
    int? maxResults,
    String? pageToken,
    String? selectedFields,
    String? startIndex,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #list,
          [
            projectId,
            datasetId,
            tableId,
          ],
          {
            #maxResults: maxResults,
            #pageToken: pageToken,
            #selectedFields: selectedFields,
            #startIndex: startIndex,
            #$fields: $fields,
          },
        ),
        returnValue: _i21.Future<_i6.TableDataList>.value(_FakeTableDataList_99(
          this,
          Invocation.method(
            #list,
            [
              projectId,
              datasetId,
              tableId,
            ],
            {
              #maxResults: maxResults,
              #pageToken: pageToken,
              #selectedFields: selectedFields,
              #startIndex: startIndex,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i21.Future<_i6.TableDataList>);
}

/// A class which mocks [UsersService].
///
/// See the documentation for Mockito's code generation for more information.
class MockUsersService extends _i1.Mock implements _i14.UsersService {
  MockUsersService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i14.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_20(
          this,
          Invocation.getter(#github),
        ),
      ) as _i14.GitHub);

  @override
  _i21.Future<_i14.User> getUser(String? name) => (super.noSuchMethod(
        Invocation.method(
          #getUser,
          [name],
        ),
        returnValue: _i21.Future<_i14.User>.value(_FakeUser_100(
          this,
          Invocation.method(
            #getUser,
            [name],
          ),
        )),
      ) as _i21.Future<_i14.User>);

  @override
  _i21.Future<_i14.CurrentUser> editCurrentUser({
    String? name,
    String? email,
    String? blog,
    String? company,
    String? location,
    bool? hireable,
    String? bio,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #editCurrentUser,
          [],
          {
            #name: name,
            #email: email,
            #blog: blog,
            #company: company,
            #location: location,
            #hireable: hireable,
            #bio: bio,
          },
        ),
        returnValue: _i21.Future<_i14.CurrentUser>.value(_FakeCurrentUser_101(
          this,
          Invocation.method(
            #editCurrentUser,
            [],
            {
              #name: name,
              #email: email,
              #blog: blog,
              #company: company,
              #location: location,
              #hireable: hireable,
              #bio: bio,
            },
          ),
        )),
      ) as _i21.Future<_i14.CurrentUser>);

  @override
  _i21.Stream<_i14.User> getUsers(
    List<String>? names, {
    int? pages,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getUsers,
          [names],
          {#pages: pages},
        ),
        returnValue: _i21.Stream<_i14.User>.empty(),
      ) as _i21.Stream<_i14.User>);

  @override
  _i21.Future<_i14.CurrentUser> getCurrentUser() => (super.noSuchMethod(
        Invocation.method(
          #getCurrentUser,
          [],
        ),
        returnValue: _i21.Future<_i14.CurrentUser>.value(_FakeCurrentUser_101(
          this,
          Invocation.method(
            #getCurrentUser,
            [],
          ),
        )),
      ) as _i21.Future<_i14.CurrentUser>);

  @override
  _i21.Future<bool> isUser(String? name) => (super.noSuchMethod(
        Invocation.method(
          #isUser,
          [name],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.User> listUsers({
    int? pages,
    int? since,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listUsers,
          [],
          {
            #pages: pages,
            #since: since,
          },
        ),
        returnValue: _i21.Stream<_i14.User>.empty(),
      ) as _i21.Stream<_i14.User>);

  @override
  _i21.Stream<_i14.UserEmail> listEmails() => (super.noSuchMethod(
        Invocation.method(
          #listEmails,
          [],
        ),
        returnValue: _i21.Stream<_i14.UserEmail>.empty(),
      ) as _i21.Stream<_i14.UserEmail>);

  @override
  _i21.Stream<_i14.UserEmail> addEmails(List<String>? emails) => (super.noSuchMethod(
        Invocation.method(
          #addEmails,
          [emails],
        ),
        returnValue: _i21.Stream<_i14.UserEmail>.empty(),
      ) as _i21.Stream<_i14.UserEmail>);

  @override
  _i21.Future<bool> deleteEmails(List<String>? emails) => (super.noSuchMethod(
        Invocation.method(
          #deleteEmails,
          [emails],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.User> listUserFollowers(String? user) => (super.noSuchMethod(
        Invocation.method(
          #listUserFollowers,
          [user],
        ),
        returnValue: _i21.Stream<_i14.User>.empty(),
      ) as _i21.Stream<_i14.User>);

  @override
  _i21.Future<bool> isFollowingUser(String? user) => (super.noSuchMethod(
        Invocation.method(
          #isFollowingUser,
          [user],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<bool> isUserFollowing(
    String? user,
    String? target,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isUserFollowing,
          [
            user,
            target,
          ],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<bool> followUser(String? user) => (super.noSuchMethod(
        Invocation.method(
          #followUser,
          [user],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Future<bool> unfollowUser(String? user) => (super.noSuchMethod(
        Invocation.method(
          #unfollowUser,
          [user],
        ),
        returnValue: _i21.Future<bool>.value(false),
      ) as _i21.Future<bool>);

  @override
  _i21.Stream<_i14.User> listCurrentUserFollowers() => (super.noSuchMethod(
        Invocation.method(
          #listCurrentUserFollowers,
          [],
        ),
        returnValue: _i21.Stream<_i14.User>.empty(),
      ) as _i21.Stream<_i14.User>);

  @override
  _i21.Stream<_i14.User> listCurrentUserFollowing() => (super.noSuchMethod(
        Invocation.method(
          #listCurrentUserFollowing,
          [],
        ),
        returnValue: _i21.Stream<_i14.User>.empty(),
      ) as _i21.Stream<_i14.User>);

  @override
  _i21.Stream<_i14.PublicKey> listPublicKeys([String? userLogin]) => (super.noSuchMethod(
        Invocation.method(
          #listPublicKeys,
          [userLogin],
        ),
        returnValue: _i21.Stream<_i14.PublicKey>.empty(),
      ) as _i21.Stream<_i14.PublicKey>);

  @override
  _i21.Future<_i14.PublicKey> createPublicKey(_i14.CreatePublicKey? key) => (super.noSuchMethod(
        Invocation.method(
          #createPublicKey,
          [key],
        ),
        returnValue: _i21.Future<_i14.PublicKey>.value(_FakePublicKey_89(
          this,
          Invocation.method(
            #createPublicKey,
            [key],
          ),
        )),
      ) as _i21.Future<_i14.PublicKey>);
}

/// A class which mocks [Cache].
///
/// See the documentation for Mockito's code generation for more information.
class MockCache extends _i1.Mock implements _i29.Cache<_i40.Uint8List> {
  MockCache() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i29.Entry<_i40.Uint8List> operator [](String? key) => (super.noSuchMethod(
        Invocation.method(
          #[],
          [key],
        ),
        returnValue: _FakeEntry_102<_i40.Uint8List>(
          this,
          Invocation.method(
            #[],
            [key],
          ),
        ),
      ) as _i29.Entry<_i40.Uint8List>);

  @override
  _i29.Cache<_i40.Uint8List> withPrefix(String? prefix) => (super.noSuchMethod(
        Invocation.method(
          #withPrefix,
          [prefix],
        ),
        returnValue: _FakeCache_103<_i40.Uint8List>(
          this,
          Invocation.method(
            #withPrefix,
            [prefix],
          ),
        ),
      ) as _i29.Cache<_i40.Uint8List>);

  @override
  _i29.Cache<S> withCodec<S>(_i27.Codec<S, _i40.Uint8List>? codec) => (super.noSuchMethod(
        Invocation.method(
          #withCodec,
          [codec],
        ),
        returnValue: _FakeCache_103<S>(
          this,
          Invocation.method(
            #withCodec,
            [codec],
          ),
        ),
      ) as _i29.Cache<S>);

  @override
  _i29.Cache<_i40.Uint8List> withTTL(Duration? ttl) => (super.noSuchMethod(
        Invocation.method(
          #withTTL,
          [ttl],
        ),
        returnValue: _FakeCache_103<_i40.Uint8List>(
          this,
          Invocation.method(
            #withTTL,
            [ttl],
          ),
        ),
      ) as _i29.Cache<_i40.Uint8List>);
}

/// A class which mocks [GitHub].
///
/// See the documentation for Mockito's code generation for more information.
class MockGitHub extends _i1.Mock implements _i14.GitHub {
  MockGitHub() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i14.Authentication get auth => (super.noSuchMethod(
        Invocation.getter(#auth),
        returnValue: _FakeAuthentication_104(
          this,
          Invocation.getter(#auth),
        ),
      ) as _i14.Authentication);

  @override
  set auth(_i14.Authentication? _auth) => super.noSuchMethod(
        Invocation.setter(
          #auth,
          _auth,
        ),
        returnValueForMissingStub: null,
      );

  @override
  String get endpoint => (super.noSuchMethod(
        Invocation.getter(#endpoint),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#endpoint),
        ),
      ) as String);

  @override
  String get version => (super.noSuchMethod(
        Invocation.getter(#version),
        returnValue: _i32.dummyValue<String>(
          this,
          Invocation.getter(#version),
        ),
      ) as String);

  @override
  _i2.Client get client => (super.noSuchMethod(
        Invocation.getter(#client),
        returnValue: _FakeClient_0(
          this,
          Invocation.getter(#client),
        ),
      ) as _i2.Client);

  @override
  _i14.ActivityService get activity => (super.noSuchMethod(
        Invocation.getter(#activity),
        returnValue: _FakeActivityService_105(
          this,
          Invocation.getter(#activity),
        ),
      ) as _i14.ActivityService);

  @override
  _i14.AuthorizationsService get authorizations => (super.noSuchMethod(
        Invocation.getter(#authorizations),
        returnValue: _FakeAuthorizationsService_106(
          this,
          Invocation.getter(#authorizations),
        ),
      ) as _i14.AuthorizationsService);

  @override
  _i14.GistsService get gists => (super.noSuchMethod(
        Invocation.getter(#gists),
        returnValue: _FakeGistsService_107(
          this,
          Invocation.getter(#gists),
        ),
      ) as _i14.GistsService);

  @override
  _i14.GitService get git => (super.noSuchMethod(
        Invocation.getter(#git),
        returnValue: _FakeGitService_108(
          this,
          Invocation.getter(#git),
        ),
      ) as _i14.GitService);

  @override
  _i14.IssuesService get issues => (super.noSuchMethod(
        Invocation.getter(#issues),
        returnValue: _FakeIssuesService_109(
          this,
          Invocation.getter(#issues),
        ),
      ) as _i14.IssuesService);

  @override
  _i14.MiscService get misc => (super.noSuchMethod(
        Invocation.getter(#misc),
        returnValue: _FakeMiscService_110(
          this,
          Invocation.getter(#misc),
        ),
      ) as _i14.MiscService);

  @override
  _i14.OrganizationsService get organizations => (super.noSuchMethod(
        Invocation.getter(#organizations),
        returnValue: _FakeOrganizationsService_111(
          this,
          Invocation.getter(#organizations),
        ),
      ) as _i14.OrganizationsService);

  @override
  _i14.PullRequestsService get pullRequests => (super.noSuchMethod(
        Invocation.getter(#pullRequests),
        returnValue: _FakePullRequestsService_112(
          this,
          Invocation.getter(#pullRequests),
        ),
      ) as _i14.PullRequestsService);

  @override
  _i14.RepositoriesService get repositories => (super.noSuchMethod(
        Invocation.getter(#repositories),
        returnValue: _FakeRepositoriesService_113(
          this,
          Invocation.getter(#repositories),
        ),
      ) as _i14.RepositoriesService);

  @override
  _i14.SearchService get search => (super.noSuchMethod(
        Invocation.getter(#search),
        returnValue: _FakeSearchService_114(
          this,
          Invocation.getter(#search),
        ),
      ) as _i14.SearchService);

  @override
  _i14.UrlShortenerService get urlShortener => (super.noSuchMethod(
        Invocation.getter(#urlShortener),
        returnValue: _FakeUrlShortenerService_115(
          this,
          Invocation.getter(#urlShortener),
        ),
      ) as _i14.UrlShortenerService);

  @override
  _i14.UsersService get users => (super.noSuchMethod(
        Invocation.getter(#users),
        returnValue: _FakeUsersService_116(
          this,
          Invocation.getter(#users),
        ),
      ) as _i14.UsersService);

  @override
  _i14.ChecksService get checks => (super.noSuchMethod(
        Invocation.getter(#checks),
        returnValue: _FakeChecksService_117(
          this,
          Invocation.getter(#checks),
        ),
      ) as _i14.ChecksService);

  @override
  _i21.Future<T> getJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, String>? params,
    _i14.JSONConverter<S, T>? convert,
    String? preview,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getJSON,
          [path],
          {
            #statusCode: statusCode,
            #fail: fail,
            #headers: headers,
            #params: params,
            #convert: convert,
            #preview: preview,
          },
        ),
        returnValue: _i32.ifNotNull(
              _i32.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #getJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i21.Future<T>.value(v),
            ) ??
            _FakeFuture_27<T>(
              this,
              Invocation.method(
                #getJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #preview: preview,
                },
              ),
            ),
      ) as _i21.Future<T>);

  @override
  _i21.Future<T> postJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i14.JSONConverter<S, T>? convert,
    dynamic body,
    String? preview,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #postJSON,
          [path],
          {
            #statusCode: statusCode,
            #fail: fail,
            #headers: headers,
            #params: params,
            #convert: convert,
            #body: body,
            #preview: preview,
          },
        ),
        returnValue: _i51.postJsonShim<S, T>(
          path,
          statusCode: statusCode,
          fail: fail,
          headers: headers,
          params: params,
          convert: convert,
          body: body,
          preview: preview,
        ),
      ) as _i21.Future<T>);

  @override
  _i21.Future<T> putJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i14.JSONConverter<S, T>? convert,
    dynamic body,
    String? preview,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #putJSON,
          [path],
          {
            #statusCode: statusCode,
            #fail: fail,
            #headers: headers,
            #params: params,
            #convert: convert,
            #body: body,
            #preview: preview,
          },
        ),
        returnValue: _i32.ifNotNull(
              _i32.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #putJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i21.Future<T>.value(v),
            ) ??
            _FakeFuture_27<T>(
              this,
              Invocation.method(
                #putJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i21.Future<T>);

  @override
  _i21.Future<T> patchJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i14.JSONConverter<S, T>? convert,
    dynamic body,
    String? preview,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #patchJSON,
          [path],
          {
            #statusCode: statusCode,
            #fail: fail,
            #headers: headers,
            #params: params,
            #convert: convert,
            #body: body,
            #preview: preview,
          },
        ),
        returnValue: _i32.ifNotNull(
              _i32.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #patchJSON,
                  [path],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i21.Future<T>.value(v),
            ) ??
            _FakeFuture_27<T>(
              this,
              Invocation.method(
                #patchJSON,
                [path],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i21.Future<T>);

  @override
  _i21.Future<T> requestJson<S, T>(
    String? method,
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i14.JSONConverter<S, T?>? convert,
    dynamic body,
    String? preview,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #requestJson,
          [
            method,
            path,
          ],
          {
            #statusCode: statusCode,
            #fail: fail,
            #headers: headers,
            #params: params,
            #convert: convert,
            #body: body,
            #preview: preview,
          },
        ),
        returnValue: _i32.ifNotNull(
              _i32.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #requestJson,
                  [
                    method,
                    path,
                  ],
                  {
                    #statusCode: statusCode,
                    #fail: fail,
                    #headers: headers,
                    #params: params,
                    #convert: convert,
                    #body: body,
                    #preview: preview,
                  },
                ),
              ),
              (T v) => _i21.Future<T>.value(v),
            ) ??
            _FakeFuture_27<T>(
              this,
              Invocation.method(
                #requestJson,
                [
                  method,
                  path,
                ],
                {
                  #statusCode: statusCode,
                  #fail: fail,
                  #headers: headers,
                  #params: params,
                  #convert: convert,
                  #body: body,
                  #preview: preview,
                },
              ),
            ),
      ) as _i21.Future<T>);

  @override
  _i21.Future<_i2.Response> request(
    String? method,
    String? path, {
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    dynamic body,
    int? statusCode,
    void Function(_i2.Response)? fail,
    String? preview,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #request,
          [
            method,
            path,
          ],
          {
            #headers: headers,
            #params: params,
            #body: body,
            #statusCode: statusCode,
            #fail: fail,
            #preview: preview,
          },
        ),
        returnValue: _i21.Future<_i2.Response>.value(_FakeResponse_118(
          this,
          Invocation.method(
            #request,
            [
              method,
              path,
            ],
            {
              #headers: headers,
              #params: params,
              #body: body,
              #statusCode: statusCode,
              #fail: fail,
              #preview: preview,
            },
          ),
        )),
      ) as _i21.Future<_i2.Response>);

  @override
  Never handleStatusCode(_i2.Response? response) => (super.noSuchMethod(
        Invocation.method(
          #handleStatusCode,
          [response],
        ),
        returnValue: null,
      ) as Never);

  @override
  void dispose() => super.noSuchMethod(
        Invocation.method(
          #dispose,
          [],
        ),
        returnValueForMissingStub: null,
      );
}
