// Mocks generated by Mockito 5.3.2 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 _i17;
import 'dart:convert' as _i16;
import 'dart:io' as _i15;
import 'dart:typed_data' as _i27;

import 'package:cocoon_service/src/foundation/github_checks_util.dart' as _i11;
import 'package:cocoon_service/src/foundation/utils.dart' as _i35;
import 'package:cocoon_service/src/model/appengine/commit.dart' as _i34;
import 'package:cocoon_service/src/model/appengine/task.dart' as _i36;
import 'package:cocoon_service/src/model/ci_yaml/target.dart' as _i32;
import 'package:cocoon_service/src/model/github/checks.dart' as _i33;
import 'package:cocoon_service/src/model/luci/buildbucket.dart' as _i9;
import 'package:cocoon_service/src/model/luci/push_message.dart' as _i30;
import 'package:cocoon_service/src/request_handling/pubsub.dart' as _i19;
import 'package:cocoon_service/src/service/access_client_provider.dart' as _i5;
import 'package:cocoon_service/src/service/access_token_provider.dart' as _i21;
import 'package:cocoon_service/src/service/bigquery.dart' as _i22;
import 'package:cocoon_service/src/service/branch_service.dart' as _i23;
import 'package:cocoon_service/src/service/buildbucket.dart' as _i18;
import 'package:cocoon_service/src/service/config.dart' as _i3;
import 'package:cocoon_service/src/service/datastore.dart' as _i37;
import 'package:cocoon_service/src/service/gerrit_service.dart' as _i7;
import 'package:cocoon_service/src/service/github_checks_service.dart' as _i28;
import 'package:cocoon_service/src/service/github_service.dart' as _i25;
import 'package:cocoon_service/src/service/luci_build_service.dart' as _i31;
import 'package:cocoon_service/src/service/scheduler.dart' as _i29;
import 'package:github/github.dart' as _i10;
import 'package:github/hooks.dart' as _i24;
import 'package:googleapis/bigquery/v2.dart' as _i6;
import 'package:googleapis_auth/auth_io.dart' as _i4;
import 'package:graphql/src/cache/cache.dart' as _i13;
import 'package:graphql/src/core/core.dart' as _i12;
import 'package:graphql/src/graphql_client.dart' as _i14;
import 'package:http/http.dart' as _i2;
import 'package:mockito/mockito.dart' as _i1;
import 'package:neat_cache/neat_cache.dart' as _i20;
import 'package:process/src/interface/process_manager.dart' as _i38;
import 'package:retry/retry.dart' as _i8;

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

// 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: 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 _FakeRetryOptions_7 extends _i1.SmartFake implements _i8.RetryOptions {
  _FakeRetryOptions_7(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class _FakeObservableQuery_34<TParsed> extends _i1.SmartFake implements _i12.ObservableQuery<TParsed> {
  _FakeObservableQuery_34(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeQueryResult_35<TParsed extends Object?> extends _i1.SmartFake implements _i12.QueryResult<TParsed> {
  _FakeQueryResult_35(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class _FakeResponse_95 extends _i1.SmartFake implements _i2.Response {
  _FakeResponse_95(
    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
  _i17.Future<_i2.Client> createAccessClient(
          {List<String>? scopes = const [r'https://www.googleapis.com/auth/cloud-platform']}) =>
      (super.noSuchMethod(
        Invocation.method(
          #createAccessClient,
          [],
          {#scopes: scopes},
        ),
        returnValue: _i17.Future<_i2.Client>.value(_FakeClient_0(
          this,
          Invocation.method(
            #createAccessClient,
            [],
            {#scopes: scopes},
          ),
        )),
      ) as _i17.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 _i21.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
  _i17.Future<_i4.AccessToken> createAccessToken() => (super.noSuchMethod(
        Invocation.method(
          #createAccessToken,
          [],
        ),
        returnValue: _i17.Future<_i4.AccessToken>.value(_FakeAccessToken_2(
          this,
          Invocation.method(
            #createAccessToken,
            [],
          ),
        )),
      ) as _i17.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 _i22.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
  _i17.Future<_i6.TabledataResource> defaultTabledata() => (super.noSuchMethod(
        Invocation.method(
          #defaultTabledata,
          [],
        ),
        returnValue: _i17.Future<_i6.TabledataResource>.value(_FakeTabledataResource_4(
          this,
          Invocation.method(
            #defaultTabledata,
            [],
          ),
        )),
      ) as _i17.Future<_i6.TabledataResource>);
  @override
  _i17.Future<_i6.JobsResource> defaultJobs() => (super.noSuchMethod(
        Invocation.method(
          #defaultJobs,
          [],
        ),
        returnValue: _i17.Future<_i6.JobsResource>.value(_FakeJobsResource_5(
          this,
          Invocation.method(
            #defaultJobs,
            [],
          ),
        )),
      ) as _i17.Future<_i6.JobsResource>);
  @override
  _i17.Future<List<_i22.BuilderStatistic>> listBuilderStatistic(
    String? projectId, {
    int? limit = 100,
    String? bucket = r'prod',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listBuilderStatistic,
          [projectId],
          {
            #limit: limit,
            #bucket: bucket,
          },
        ),
        returnValue: _i17.Future<List<_i22.BuilderStatistic>>.value(<_i22.BuilderStatistic>[]),
      ) as _i17.Future<List<_i22.BuilderStatistic>>);
  @override
  _i17.Future<List<_i22.BuilderRecord>> listRecentBuildRecordsForBuilder(
    String? projectId, {
    String? builder,
    int? limit,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listRecentBuildRecordsForBuilder,
          [projectId],
          {
            #builder: builder,
            #limit: limit,
          },
        ),
        returnValue: _i17.Future<List<_i22.BuilderRecord>>.value(<_i22.BuilderRecord>[]),
      ) as _i17.Future<List<_i22.BuilderRecord>>);
}

/// A class which mocks [BranchService].
///
/// See the documentation for Mockito's code generation for more information.
class MockBranchService extends _i1.Mock implements _i23.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
  _i8.RetryOptions get retryOptions => (super.noSuchMethod(
        Invocation.getter(#retryOptions),
        returnValue: _FakeRetryOptions_7(
          this,
          Invocation.getter(#retryOptions),
        ),
      ) as _i8.RetryOptions);
  @override
  _i17.Future<void> handleCreateRequest(_i24.CreateEvent? createEvent) => (super.noSuchMethod(
        Invocation.method(
          #handleCreateRequest,
          [createEvent],
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<void> branchFlutterRecipes(String? branch) => (super.noSuchMethod(
        Invocation.method(
          #branchFlutterRecipes,
          [branch],
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<List<Map<String, String>>> getReleaseBranches({
    required _i25.GithubService? githubService,
    required _i10.RepositorySlug? slug,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseBranches,
          [],
          {
            #githubService: githubService,
            #slug: slug,
          },
        ),
        returnValue: _i17.Future<List<Map<String, String>>>.value(<Map<String, String>>[]),
      ) as _i17.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 _i18.BuildBucketClient {
  MockBuildBucketClient() {
    _i1.throwOnMissingStub(this);
  }

  @override
  String get buildBucketBuildUri => (super.noSuchMethod(
        Invocation.getter(#buildBucketBuildUri),
        returnValue: '',
      ) as String);
  @override
  String get buildBucketBuilderUri => (super.noSuchMethod(
        Invocation.getter(#buildBucketBuilderUri),
        returnValue: '',
      ) as String);
  @override
  _i2.Client get httpClient => (super.noSuchMethod(
        Invocation.getter(#httpClient),
        returnValue: _FakeClient_0(
          this,
          Invocation.getter(#httpClient),
        ),
      ) as _i2.Client);
  @override
  _i17.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: _i17.Future<_i9.Build>.value(_FakeBuild_8(
          this,
          Invocation.method(
            #scheduleBuild,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i17.Future<_i9.Build>);
  @override
  _i17.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: _i17.Future<_i9.SearchBuildsResponse>.value(_FakeSearchBuildsResponse_9(
          this,
          Invocation.method(
            #searchBuilds,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i17.Future<_i9.SearchBuildsResponse>);
  @override
  _i17.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: _i17.Future<_i9.BatchResponse>.value(_FakeBatchResponse_10(
          this,
          Invocation.method(
            #batch,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i17.Future<_i9.BatchResponse>);
  @override
  _i17.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: _i17.Future<_i9.Build>.value(_FakeBuild_8(
          this,
          Invocation.method(
            #cancelBuild,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i17.Future<_i9.Build>);
  @override
  _i17.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: _i17.Future<_i9.Build>.value(_FakeBuild_8(
          this,
          Invocation.method(
            #getBuild,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i17.Future<_i9.Build>);
  @override
  _i17.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: _i17.Future<_i9.ListBuildersResponse>.value(_FakeListBuildersResponse_11(
          this,
          Invocation.method(
            #listBuilders,
            [request],
            {#buildBucketUri: buildBucketUri},
          ),
        )),
      ) as _i17.Future<_i9.ListBuildersResponse>);
  @override
  void close() => super.noSuchMethod(
        Invocation.method(
          #close,
          [],
        ),
        returnValueForMissingStub: null,
      );
}

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

  @override
  _i27.Uint8List get value => (super.noSuchMethod(
        Invocation.getter(#value),
        returnValue: _i27.Uint8List(0),
      ) as _i27.Uint8List);
  @override
  set value(_i27.Uint8List? _value) => super.noSuchMethod(
        Invocation.setter(
          #value,
          _value,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i17.Future<_i27.Uint8List> get([
    _i17.Future<_i27.Uint8List?> Function()? create,
    Duration? ttl,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            create,
            ttl,
          ],
        ),
        returnValue: _i17.Future<_i27.Uint8List>.value(_i27.Uint8List(0)),
      ) as _i17.Future<_i27.Uint8List>);
  @override
  _i17.Future<void> purge({int? retries = 0}) => (super.noSuchMethod(
        Invocation.method(
          #purge,
          [],
          {#retries: retries},
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<_i27.Uint8List?> set(
    _i27.Uint8List? value, [
    Duration? ttl,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #set,
          [
            value,
            ttl,
          ],
        ),
        returnValue: _i17.Future<_i27.Uint8List?>.value(),
      ) as _i17.Future<_i27.Uint8List?>);
}

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

  @override
  _i10.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_12(
          this,
          Invocation.getter(#github),
        ),
      ) as _i10.GitHub);
  @override
  _i17.Stream<_i10.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: _i17.Stream<_i10.Issue>.empty(),
      ) as _i17.Stream<_i10.Issue>);
  @override
  _i17.Stream<_i10.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: _i17.Stream<_i10.Issue>.empty(),
      ) as _i17.Stream<_i10.Issue>);
  @override
  _i17.Stream<_i10.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: _i17.Stream<_i10.Issue>.empty(),
      ) as _i17.Stream<_i10.Issue>);
  @override
  _i17.Stream<_i10.Issue> listByRepo(
    _i10.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: _i17.Stream<_i10.Issue>.empty(),
      ) as _i17.Stream<_i10.Issue>);
  @override
  _i17.Stream<_i10.Reaction> listReactions(
    _i10.RepositorySlug? slug,
    int? issueNumber, {
    _i10.ReactionType? content,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReactions,
          [
            slug,
            issueNumber,
          ],
          {#content: content},
        ),
        returnValue: _i17.Stream<_i10.Reaction>.empty(),
      ) as _i17.Stream<_i10.Reaction>);
  @override
  _i17.Future<_i10.Issue> edit(
    _i10.RepositorySlug? slug,
    int? issueNumber,
    _i10.IssueRequest? issue,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #edit,
          [
            slug,
            issueNumber,
            issue,
          ],
        ),
        returnValue: _i17.Future<_i10.Issue>.value(_FakeIssue_13(
          this,
          Invocation.method(
            #edit,
            [
              slug,
              issueNumber,
              issue,
            ],
          ),
        )),
      ) as _i17.Future<_i10.Issue>);
  @override
  _i17.Future<_i10.Issue> get(
    _i10.RepositorySlug? slug,
    int? issueNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            slug,
            issueNumber,
          ],
        ),
        returnValue: _i17.Future<_i10.Issue>.value(_FakeIssue_13(
          this,
          Invocation.method(
            #get,
            [
              slug,
              issueNumber,
            ],
          ),
        )),
      ) as _i17.Future<_i10.Issue>);
  @override
  _i17.Future<_i10.Issue> create(
    _i10.RepositorySlug? slug,
    _i10.IssueRequest? issue,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #create,
          [
            slug,
            issue,
          ],
        ),
        returnValue: _i17.Future<_i10.Issue>.value(_FakeIssue_13(
          this,
          Invocation.method(
            #create,
            [
              slug,
              issue,
            ],
          ),
        )),
      ) as _i17.Future<_i10.Issue>);
  @override
  _i17.Stream<_i10.User> listAssignees(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listAssignees,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.User>.empty(),
      ) as _i17.Stream<_i10.User>);
  @override
  _i17.Future<bool> isAssignee(
    _i10.RepositorySlug? slug,
    String? repoName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isAssignee,
          [
            slug,
            repoName,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.IssueComment> listCommentsByIssue(
    _i10.RepositorySlug? slug,
    int? issueNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommentsByIssue,
          [
            slug,
            issueNumber,
          ],
        ),
        returnValue: _i17.Stream<_i10.IssueComment>.empty(),
      ) as _i17.Stream<_i10.IssueComment>);
  @override
  _i17.Stream<_i10.IssueComment> listCommentsByRepo(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommentsByRepo,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.IssueComment>.empty(),
      ) as _i17.Stream<_i10.IssueComment>);
  @override
  _i17.Future<_i10.IssueComment> getComment(
    _i10.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getComment,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i17.Future<_i10.IssueComment>.value(_FakeIssueComment_14(
          this,
          Invocation.method(
            #getComment,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i17.Future<_i10.IssueComment>);
  @override
  _i17.Future<_i10.IssueComment> createComment(
    _i10.RepositorySlug? slug,
    int? issueNumber,
    String? body,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createComment,
          [
            slug,
            issueNumber,
            body,
          ],
        ),
        returnValue: _i17.Future<_i10.IssueComment>.value(_FakeIssueComment_14(
          this,
          Invocation.method(
            #createComment,
            [
              slug,
              issueNumber,
              body,
            ],
          ),
        )),
      ) as _i17.Future<_i10.IssueComment>);
  @override
  _i17.Future<_i10.IssueComment> updateComment(
    _i10.RepositorySlug? slug,
    int? id,
    String? body,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateComment,
          [
            slug,
            id,
            body,
          ],
        ),
        returnValue: _i17.Future<_i10.IssueComment>.value(_FakeIssueComment_14(
          this,
          Invocation.method(
            #updateComment,
            [
              slug,
              id,
              body,
            ],
          ),
        )),
      ) as _i17.Future<_i10.IssueComment>);
  @override
  _i17.Future<bool> deleteComment(
    _i10.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteComment,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.IssueLabel> listLabels(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listLabels,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.IssueLabel>.empty(),
      ) as _i17.Stream<_i10.IssueLabel>);
  @override
  _i17.Future<_i10.IssueLabel> getLabel(
    _i10.RepositorySlug? slug,
    String? name,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getLabel,
          [
            slug,
            name,
          ],
        ),
        returnValue: _i17.Future<_i10.IssueLabel>.value(_FakeIssueLabel_15(
          this,
          Invocation.method(
            #getLabel,
            [
              slug,
              name,
            ],
          ),
        )),
      ) as _i17.Future<_i10.IssueLabel>);
  @override
  _i17.Future<_i10.IssueLabel> createLabel(
    _i10.RepositorySlug? slug,
    String? name,
    String? color,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createLabel,
          [
            slug,
            name,
            color,
          ],
        ),
        returnValue: _i17.Future<_i10.IssueLabel>.value(_FakeIssueLabel_15(
          this,
          Invocation.method(
            #createLabel,
            [
              slug,
              name,
              color,
            ],
          ),
        )),
      ) as _i17.Future<_i10.IssueLabel>);
  @override
  _i17.Future<_i10.IssueLabel> editLabel(
    _i10.RepositorySlug? slug,
    String? name,
    String? color,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #editLabel,
          [
            slug,
            name,
            color,
          ],
        ),
        returnValue: _i17.Future<_i10.IssueLabel>.value(_FakeIssueLabel_15(
          this,
          Invocation.method(
            #editLabel,
            [
              slug,
              name,
              color,
            ],
          ),
        )),
      ) as _i17.Future<_i10.IssueLabel>);
  @override
  _i17.Future<bool> deleteLabel(
    _i10.RepositorySlug? slug,
    String? name,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteLabel,
          [
            slug,
            name,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.IssueLabel> listLabelsByIssue(
    _i10.RepositorySlug? slug,
    int? issueNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listLabelsByIssue,
          [
            slug,
            issueNumber,
          ],
        ),
        returnValue: _i17.Stream<_i10.IssueLabel>.empty(),
      ) as _i17.Stream<_i10.IssueLabel>);
  @override
  _i17.Future<List<_i10.IssueLabel>> addLabelsToIssue(
    _i10.RepositorySlug? slug,
    int? issueNumber,
    List<String>? labels,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #addLabelsToIssue,
          [
            slug,
            issueNumber,
            labels,
          ],
        ),
        returnValue: _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]),
      ) as _i17.Future<List<_i10.IssueLabel>>);
  @override
  _i17.Future<List<_i10.IssueLabel>> replaceLabelsForIssue(
    _i10.RepositorySlug? slug,
    int? issueNumber,
    List<String>? labels,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #replaceLabelsForIssue,
          [
            slug,
            issueNumber,
            labels,
          ],
        ),
        returnValue: _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]),
      ) as _i17.Future<List<_i10.IssueLabel>>);
  @override
  _i17.Future<bool> removeLabelForIssue(
    _i10.RepositorySlug? slug,
    int? issueNumber,
    String? label,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeLabelForIssue,
          [
            slug,
            issueNumber,
            label,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<bool> removeAllLabelsForIssue(
    _i10.RepositorySlug? slug,
    int? issueNumber,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeAllLabelsForIssue,
          [
            slug,
            issueNumber,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.Milestone> listMilestones(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listMilestones,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.Milestone>.empty(),
      ) as _i17.Stream<_i10.Milestone>);
  @override
  _i17.Future<_i10.Milestone> createMilestone(
    _i10.RepositorySlug? slug,
    _i10.CreateMilestone? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createMilestone,
          [
            slug,
            request,
          ],
        ),
        returnValue: _i17.Future<_i10.Milestone>.value(_FakeMilestone_16(
          this,
          Invocation.method(
            #createMilestone,
            [
              slug,
              request,
            ],
          ),
        )),
      ) as _i17.Future<_i10.Milestone>);
  @override
  _i17.Future<bool> deleteMilestone(
    _i10.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteMilestone,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
}

/// A class which mocks [GithubChecksService].
///
/// See the documentation for Mockito's code generation for more information.
class MockGithubChecksService extends _i1.Mock implements _i28.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
  _i11.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
        Invocation.getter(#githubChecksUtil),
        returnValue: _FakeGithubChecksUtil_17(
          this,
          Invocation.getter(#githubChecksUtil),
        ),
      ) as _i11.GithubChecksUtil);
  @override
  set githubChecksUtil(_i11.GithubChecksUtil? _githubChecksUtil) => super.noSuchMethod(
        Invocation.setter(
          #githubChecksUtil,
          _githubChecksUtil,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i17.Future<void> handleCheckSuite(
    _i10.PullRequest? pullRequest,
    _i24.CheckSuiteEvent? checkSuiteEvent,
    _i29.Scheduler? scheduler,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #handleCheckSuite,
          [
            pullRequest,
            checkSuiteEvent,
            scheduler,
          ],
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<bool> updateCheckStatus(
    _i30.BuildPushMessage? buildPushMessage,
    _i31.LuciBuildService? luciBuildService,
    _i10.RepositorySlug? slug,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCheckStatus,
          [
            buildPushMessage,
            luciBuildService,
            slug,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  String getGithubSummary(String? summary) => (super.noSuchMethod(
        Invocation.method(
          #getGithubSummary,
          [summary],
        ),
        returnValue: '',
      ) as String);
  @override
  _i10.CheckRunConclusion conclusionForResult(_i30.Result? result) => (super.noSuchMethod(
        Invocation.method(
          #conclusionForResult,
          [result],
        ),
        returnValue: _FakeCheckRunConclusion_18(
          this,
          Invocation.method(
            #conclusionForResult,
            [result],
          ),
        ),
      ) as _i10.CheckRunConclusion);
  @override
  _i10.CheckRunStatus statusForResult(_i30.Status? status) => (super.noSuchMethod(
        Invocation.method(
          #statusForResult,
          [status],
        ),
        returnValue: _FakeCheckRunStatus_19(
          this,
          Invocation.method(
            #statusForResult,
            [status],
          ),
        ),
      ) as _i10.CheckRunStatus);
  @override
  _i17.Future<_i10.PullRequest?> findMatchingPullRequest(
    _i10.RepositorySlug? slug,
    String? headSha,
    int? checkSuiteId,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #findMatchingPullRequest,
          [
            slug,
            headSha,
            checkSuiteId,
          ],
        ),
        returnValue: _i17.Future<_i10.PullRequest?>.value(),
      ) as _i17.Future<_i10.PullRequest?>);
}

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

  @override
  _i17.Future<Map<String, _i10.CheckRun>> allCheckRuns(
    _i10.GitHub? gitHubClient,
    _i24.CheckSuiteEvent? checkSuiteEvent,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #allCheckRuns,
          [
            gitHubClient,
            checkSuiteEvent,
          ],
        ),
        returnValue: _i17.Future<Map<String, _i10.CheckRun>>.value(<String, _i10.CheckRun>{}),
      ) as _i17.Future<Map<String, _i10.CheckRun>>);
  @override
  _i17.Future<_i10.CheckSuite> getCheckSuite(
    _i10.GitHub? gitHubClient,
    _i10.RepositorySlug? slug,
    int? checkSuiteId,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCheckSuite,
          [
            gitHubClient,
            slug,
            checkSuiteId,
          ],
        ),
        returnValue: _i17.Future<_i10.CheckSuite>.value(_FakeCheckSuite_20(
          this,
          Invocation.method(
            #getCheckSuite,
            [
              gitHubClient,
              slug,
              checkSuiteId,
            ],
          ),
        )),
      ) as _i17.Future<_i10.CheckSuite>);
  @override
  _i17.Future<List<_i10.CheckSuite>> listCheckSuitesForRef(
    _i10.GitHub? gitHubClient,
    _i10.RepositorySlug? slug, {
    required String? ref,
    int? appId,
    String? checkName,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCheckSuitesForRef,
          [
            gitHubClient,
            slug,
          ],
          {
            #ref: ref,
            #appId: appId,
            #checkName: checkName,
          },
        ),
        returnValue: _i17.Future<List<_i10.CheckSuite>>.value(<_i10.CheckSuite>[]),
      ) as _i17.Future<List<_i10.CheckSuite>>);
  @override
  _i17.Future<void> updateCheckRun(
    _i3.Config? cocoonConfig,
    _i10.RepositorySlug? slug,
    _i10.CheckRun? checkRun, {
    _i10.CheckRunStatus? status = _i10.CheckRunStatus.queued,
    _i10.CheckRunConclusion? conclusion,
    String? detailsUrl,
    _i10.CheckRunOutput? output,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCheckRun,
          [
            cocoonConfig,
            slug,
            checkRun,
          ],
          {
            #status: status,
            #conclusion: conclusion,
            #detailsUrl: detailsUrl,
            #output: output,
          },
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<_i10.CheckRun> getCheckRun(
    _i3.Config? cocoonConfig,
    _i10.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCheckRun,
          [
            cocoonConfig,
            slug,
            id,
          ],
        ),
        returnValue: _i17.Future<_i10.CheckRun>.value(_FakeCheckRun_21(
          this,
          Invocation.method(
            #getCheckRun,
            [
              cocoonConfig,
              slug,
              id,
            ],
          ),
        )),
      ) as _i17.Future<_i10.CheckRun>);
  @override
  _i17.Future<_i10.CheckRun> createCheckRun(
    _i3.Config? cocoonConfig,
    _i10.RepositorySlug? slug,
    String? sha,
    String? name, {
    _i10.CheckRunOutput? output,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createCheckRun,
          [
            cocoonConfig,
            slug,
            sha,
            name,
          ],
          {#output: output},
        ),
        returnValue: _i17.Future<_i10.CheckRun>.value(_FakeCheckRun_21(
          this,
          Invocation.method(
            #createCheckRun,
            [
              cocoonConfig,
              slug,
              sha,
              name,
            ],
            {#output: output},
          ),
        )),
      ) as _i17.Future<_i10.CheckRun>);
}

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

  @override
  _i10.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_12(
          this,
          Invocation.getter(#github),
        ),
      ) as _i10.GitHub);
  @override
  _i17.Future<List<_i10.RepositoryCommit>> listCommits(
    _i10.RepositorySlug? slug,
    String? branch,
    int? lastCommitTimestampMills,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommits,
          [
            slug,
            branch,
            lastCommitTimestampMills,
          ],
        ),
        returnValue: _i17.Future<List<_i10.RepositoryCommit>>.value(<_i10.RepositoryCommit>[]),
      ) as _i17.Future<List<_i10.RepositoryCommit>>);
  @override
  _i17.Future<List<_i10.PullRequest>> listPullRequests(
    _i10.RepositorySlug? slug,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listPullRequests,
          [
            slug,
            branch,
          ],
        ),
        returnValue: _i17.Future<List<_i10.PullRequest>>.value(<_i10.PullRequest>[]),
      ) as _i17.Future<List<_i10.PullRequest>>);
  @override
  _i17.Future<_i10.PullRequest> createPullRequest(
    _i10.RepositorySlug? slug, {
    required String? title,
    String? body,
    String? commitMessage,
    required _i10.GitReference? baseRef,
    List<_i10.CreateGitTreeEntry>? entries,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createPullRequest,
          [slug],
          {
            #title: title,
            #body: body,
            #commitMessage: commitMessage,
            #baseRef: baseRef,
            #entries: entries,
          },
        ),
        returnValue: _i17.Future<_i10.PullRequest>.value(_FakePullRequest_22(
          this,
          Invocation.method(
            #createPullRequest,
            [slug],
            {
              #title: title,
              #body: body,
              #commitMessage: commitMessage,
              #baseRef: baseRef,
              #entries: entries,
            },
          ),
        )),
      ) as _i17.Future<_i10.PullRequest>);
  @override
  _i17.Future<void> assignReviewer(
    _i10.RepositorySlug? slug, {
    int? pullRequestNumber,
    String? reviewer,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #assignReviewer,
          [slug],
          {
            #pullRequestNumber: pullRequestNumber,
            #reviewer: reviewer,
          },
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<List<_i10.Issue>> listIssues(
    _i10.RepositorySlug? slug, {
    List<String>? labels,
    String? state = r'open',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listIssues,
          [slug],
          {
            #labels: labels,
            #state: state,
          },
        ),
        returnValue: _i17.Future<List<_i10.Issue>>.value(<_i10.Issue>[]),
      ) as _i17.Future<List<_i10.Issue>>);
  @override
  _i17.Future<_i10.Issue>? getIssue(
    _i10.RepositorySlug? slug, {
    required int? issueNumber,
  }) =>
      (super.noSuchMethod(Invocation.method(
        #getIssue,
        [slug],
        {#issueNumber: issueNumber},
      )) as _i17.Future<_i10.Issue>?);
  @override
  _i17.Future<void> assignIssue(
    _i10.RepositorySlug? slug, {
    required int? issueNumber,
    required String? assignee,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #assignIssue,
          [slug],
          {
            #issueNumber: issueNumber,
            #assignee: assignee,
          },
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<_i10.Issue> createIssue(
    _i10.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: _i17.Future<_i10.Issue>.value(_FakeIssue_13(
          this,
          Invocation.method(
            #createIssue,
            [slug],
            {
              #title: title,
              #body: body,
              #labels: labels,
              #assignee: assignee,
            },
          ),
        )),
      ) as _i17.Future<_i10.Issue>);
  @override
  _i17.Future<_i10.IssueComment?> createComment(
    _i10.RepositorySlug? slug, {
    required int? issueNumber,
    required String? body,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createComment,
          [slug],
          {
            #issueNumber: issueNumber,
            #body: body,
          },
        ),
        returnValue: _i17.Future<_i10.IssueComment?>.value(),
      ) as _i17.Future<_i10.IssueComment?>);
  @override
  _i17.Future<List<_i10.IssueLabel>> replaceLabelsForIssue(
    _i10.RepositorySlug? slug, {
    required int? issueNumber,
    required List<String>? labels,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #replaceLabelsForIssue,
          [slug],
          {
            #issueNumber: issueNumber,
            #labels: labels,
          },
        ),
        returnValue: _i17.Future<List<_i10.IssueLabel>>.value(<_i10.IssueLabel>[]),
      ) as _i17.Future<List<_i10.IssueLabel>>);
  @override
  _i17.Future<List<String>> listFiles(_i10.PullRequest? pullRequest) => (super.noSuchMethod(
        Invocation.method(
          #listFiles,
          [pullRequest],
        ),
        returnValue: _i17.Future<List<String>>.value(<String>[]),
      ) as _i17.Future<List<String>>);
  @override
  _i17.Future<String> getFileContent(
    _i10.RepositorySlug? slug,
    String? path, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getFileContent,
          [
            slug,
            path,
          ],
          {#ref: ref},
        ),
        returnValue: _i17.Future<String>.value(''),
      ) as _i17.Future<String>);
  @override
  _i17.Future<_i10.GitReference> getReference(
    _i10.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReference,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i17.Future<_i10.GitReference>.value(_FakeGitReference_23(
          this,
          Invocation.method(
            #getReference,
            [
              slug,
              ref,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitReference>);
  @override
  _i17.Future<_i10.RateLimit> getRateLimit() => (super.noSuchMethod(
        Invocation.method(
          #getRateLimit,
          [],
        ),
        returnValue: _i17.Future<_i10.RateLimit>.value(_FakeRateLimit_24(
          this,
          Invocation.method(
            #getRateLimit,
            [],
          ),
        )),
      ) as _i17.Future<_i10.RateLimit>);
  @override
  _i17.Future<List<_i10.Issue>> searchIssuesAndPRs(
    _i10.RepositorySlug? slug,
    String? query, {
    String? sort,
    int? pages = 2,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #searchIssuesAndPRs,
          [
            slug,
            query,
          ],
          {
            #sort: sort,
            #pages: pages,
          },
        ),
        returnValue: _i17.Future<List<_i10.Issue>>.value(<_i10.Issue>[]),
      ) as _i17.Future<List<_i10.Issue>>);
  @override
  _i17.Future<_i10.PullRequest> getPullRequest(
    _i10.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getPullRequest,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i17.Future<_i10.PullRequest>.value(_FakePullRequest_22(
          this,
          Invocation.method(
            #getPullRequest,
            [
              slug,
              number,
            ],
          ),
        )),
      ) as _i17.Future<_i10.PullRequest>);
}

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

  @override
  _i10.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_12(
          this,
          Invocation.getter(#github),
        ),
      ) as _i10.GitHub);
  @override
  _i17.Future<_i10.GitBlob> getBlob(
    _i10.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBlob,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i17.Future<_i10.GitBlob>.value(_FakeGitBlob_25(
          this,
          Invocation.method(
            #getBlob,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitBlob>);
  @override
  _i17.Future<_i10.GitBlob> createBlob(
    _i10.RepositorySlug? slug,
    _i10.CreateGitBlob? blob,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createBlob,
          [
            slug,
            blob,
          ],
        ),
        returnValue: _i17.Future<_i10.GitBlob>.value(_FakeGitBlob_25(
          this,
          Invocation.method(
            #createBlob,
            [
              slug,
              blob,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitBlob>);
  @override
  _i17.Future<_i10.GitCommit> getCommit(
    _i10.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommit,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i17.Future<_i10.GitCommit>.value(_FakeGitCommit_26(
          this,
          Invocation.method(
            #getCommit,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitCommit>);
  @override
  _i17.Future<_i10.GitCommit> createCommit(
    _i10.RepositorySlug? slug,
    _i10.CreateGitCommit? commit,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createCommit,
          [
            slug,
            commit,
          ],
        ),
        returnValue: _i17.Future<_i10.GitCommit>.value(_FakeGitCommit_26(
          this,
          Invocation.method(
            #createCommit,
            [
              slug,
              commit,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitCommit>);
  @override
  _i17.Future<_i10.GitReference> getReference(
    _i10.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReference,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i17.Future<_i10.GitReference>.value(_FakeGitReference_23(
          this,
          Invocation.method(
            #getReference,
            [
              slug,
              ref,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitReference>);
  @override
  _i17.Stream<_i10.GitReference> listReferences(
    _i10.RepositorySlug? slug, {
    String? type,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReferences,
          [slug],
          {#type: type},
        ),
        returnValue: _i17.Stream<_i10.GitReference>.empty(),
      ) as _i17.Stream<_i10.GitReference>);
  @override
  _i17.Future<_i10.GitReference> createReference(
    _i10.RepositorySlug? slug,
    String? ref,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createReference,
          [
            slug,
            ref,
            sha,
          ],
        ),
        returnValue: _i17.Future<_i10.GitReference>.value(_FakeGitReference_23(
          this,
          Invocation.method(
            #createReference,
            [
              slug,
              ref,
              sha,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitReference>);
  @override
  _i17.Future<_i10.GitReference> editReference(
    _i10.RepositorySlug? slug,
    String? ref,
    String? sha, {
    bool? force = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #editReference,
          [
            slug,
            ref,
            sha,
          ],
          {#force: force},
        ),
        returnValue: _i17.Future<_i10.GitReference>.value(_FakeGitReference_23(
          this,
          Invocation.method(
            #editReference,
            [
              slug,
              ref,
              sha,
            ],
            {#force: force},
          ),
        )),
      ) as _i17.Future<_i10.GitReference>);
  @override
  _i17.Future<bool> deleteReference(
    _i10.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteReference,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<_i10.GitTag> getTag(
    _i10.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTag,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i17.Future<_i10.GitTag>.value(_FakeGitTag_27(
          this,
          Invocation.method(
            #getTag,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitTag>);
  @override
  _i17.Future<_i10.GitTag> createTag(
    _i10.RepositorySlug? slug,
    _i10.CreateGitTag? tag,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createTag,
          [
            slug,
            tag,
          ],
        ),
        returnValue: _i17.Future<_i10.GitTag>.value(_FakeGitTag_27(
          this,
          Invocation.method(
            #createTag,
            [
              slug,
              tag,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitTag>);
  @override
  _i17.Future<_i10.GitTree> getTree(
    _i10.RepositorySlug? slug,
    String? sha, {
    bool? recursive = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTree,
          [
            slug,
            sha,
          ],
          {#recursive: recursive},
        ),
        returnValue: _i17.Future<_i10.GitTree>.value(_FakeGitTree_28(
          this,
          Invocation.method(
            #getTree,
            [
              slug,
              sha,
            ],
            {#recursive: recursive},
          ),
        )),
      ) as _i17.Future<_i10.GitTree>);
  @override
  _i17.Future<_i10.GitTree> createTree(
    _i10.RepositorySlug? slug,
    _i10.CreateGitTree? tree,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createTree,
          [
            slug,
            tree,
          ],
        ),
        returnValue: _i17.Future<_i10.GitTree>.value(_FakeGitTree_28(
          this,
          Invocation.method(
            #createTree,
            [
              slug,
              tree,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitTree>);
}

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

  @override
  _i12.DefaultPolicies get defaultPolicies => (super.noSuchMethod(
        Invocation.getter(#defaultPolicies),
        returnValue: _FakeDefaultPolicies_29(
          this,
          Invocation.getter(#defaultPolicies),
        ),
      ) as _i12.DefaultPolicies);
  @override
  set defaultPolicies(_i12.DefaultPolicies? _defaultPolicies) => super.noSuchMethod(
        Invocation.setter(
          #defaultPolicies,
          _defaultPolicies,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i12.Link get link => (super.noSuchMethod(
        Invocation.getter(#link),
        returnValue: _FakeLink_30(
          this,
          Invocation.getter(#link),
        ),
      ) as _i12.Link);
  @override
  _i13.GraphQLCache get cache => (super.noSuchMethod(
        Invocation.getter(#cache),
        returnValue: _FakeGraphQLCache_31(
          this,
          Invocation.getter(#cache),
        ),
      ) as _i13.GraphQLCache);
  @override
  _i12.QueryManager get queryManager => (super.noSuchMethod(
        Invocation.getter(#queryManager),
        returnValue: _FakeQueryManager_32(
          this,
          Invocation.getter(#queryManager),
        ),
      ) as _i12.QueryManager);
  @override
  set queryManager(_i12.QueryManager? _queryManager) => super.noSuchMethod(
        Invocation.setter(
          #queryManager,
          _queryManager,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i14.GraphQLClient copyWith({
    _i12.Link? link,
    _i13.GraphQLCache? cache,
    _i12.DefaultPolicies? defaultPolicies,
    bool? alwaysRebroadcast,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #copyWith,
          [],
          {
            #link: link,
            #cache: cache,
            #defaultPolicies: defaultPolicies,
            #alwaysRebroadcast: alwaysRebroadcast,
          },
        ),
        returnValue: _FakeGraphQLClient_33(
          this,
          Invocation.method(
            #copyWith,
            [],
            {
              #link: link,
              #cache: cache,
              #defaultPolicies: defaultPolicies,
              #alwaysRebroadcast: alwaysRebroadcast,
            },
          ),
        ),
      ) as _i14.GraphQLClient);
  @override
  _i12.ObservableQuery<TParsed> watchQuery<TParsed>(_i12.WatchQueryOptions<TParsed>? options) => (super.noSuchMethod(
        Invocation.method(
          #watchQuery,
          [options],
        ),
        returnValue: _FakeObservableQuery_34<TParsed>(
          this,
          Invocation.method(
            #watchQuery,
            [options],
          ),
        ),
      ) as _i12.ObservableQuery<TParsed>);
  @override
  _i12.ObservableQuery<TParsed> watchMutation<TParsed>(_i12.WatchQueryOptions<TParsed>? options) => (super.noSuchMethod(
        Invocation.method(
          #watchMutation,
          [options],
        ),
        returnValue: _FakeObservableQuery_34<TParsed>(
          this,
          Invocation.method(
            #watchMutation,
            [options],
          ),
        ),
      ) as _i12.ObservableQuery<TParsed>);
  @override
  _i17.Future<_i12.QueryResult<TParsed>> query<TParsed>(_i12.QueryOptions<TParsed>? options) => (super.noSuchMethod(
        Invocation.method(
          #query,
          [options],
        ),
        returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(_FakeQueryResult_35<TParsed>(
          this,
          Invocation.method(
            #query,
            [options],
          ),
        )),
      ) as _i17.Future<_i12.QueryResult<TParsed>>);
  @override
  _i17.Future<_i12.QueryResult<TParsed>> mutate<TParsed>(_i12.MutationOptions<TParsed>? options) => (super.noSuchMethod(
        Invocation.method(
          #mutate,
          [options],
        ),
        returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(_FakeQueryResult_35<TParsed>(
          this,
          Invocation.method(
            #mutate,
            [options],
          ),
        )),
      ) as _i17.Future<_i12.QueryResult<TParsed>>);
  @override
  _i17.Stream<_i12.QueryResult<TParsed>> subscribe<TParsed>(_i12.SubscriptionOptions<TParsed>? options) =>
      (super.noSuchMethod(
        Invocation.method(
          #subscribe,
          [options],
        ),
        returnValue: _i17.Stream<_i12.QueryResult<TParsed>>.empty(),
      ) as _i17.Stream<_i12.QueryResult<TParsed>>);
  @override
  _i17.Future<_i12.QueryResult<TParsed>> fetchMore<TParsed>(
    _i12.FetchMoreOptions? fetchMoreOptions, {
    required _i12.QueryOptions<TParsed>? originalOptions,
    required _i12.QueryResult<TParsed>? previousResult,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #fetchMore,
          [fetchMoreOptions],
          {
            #originalOptions: originalOptions,
            #previousResult: previousResult,
          },
        ),
        returnValue: _i17.Future<_i12.QueryResult<TParsed>>.value(_FakeQueryResult_35<TParsed>(
          this,
          Invocation.method(
            #fetchMore,
            [fetchMoreOptions],
            {
              #originalOptions: originalOptions,
              #previousResult: previousResult,
            },
          ),
        )),
      ) as _i17.Future<_i12.QueryResult<TParsed>>);
  @override
  Map<String, dynamic>? readQuery(
    _i12.Request? request, {
    bool? optimistic = true,
  }) =>
      (super.noSuchMethod(Invocation.method(
        #readQuery,
        [request],
        {#optimistic: optimistic},
      )) as Map<String, dynamic>?);
  @override
  Map<String, dynamic>? readFragment(
    _i13.FragmentRequest? fragmentRequest, {
    bool? optimistic = true,
  }) =>
      (super.noSuchMethod(Invocation.method(
        #readFragment,
        [fragmentRequest],
        {#optimistic: optimistic},
      )) as Map<String, dynamic>?);
  @override
  void writeQuery(
    _i12.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(
    _i13.FragmentRequest? fragmentRequest, {
    bool? broadcast = true,
    required Map<String, dynamic>? data,
  }) =>
      super.noSuchMethod(
        Invocation.method(
          #writeFragment,
          [fragmentRequest],
          {
            #broadcast: broadcast,
            #data: data,
          },
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i17.Future<List<_i12.QueryResult<Object?>?>>? resetStore({bool? refetchQueries = true}) =>
      (super.noSuchMethod(Invocation.method(
        #resetStore,
        [],
        {#refetchQueries: refetchQueries},
      )) as _i17.Future<List<_i12.QueryResult<Object?>?>>?);
}

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

  @override
  Duration get idleTimeout => (super.noSuchMethod(
        Invocation.getter(#idleTimeout),
        returnValue: _FakeDuration_36(
          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(
          _i17.Future<bool> Function(
    Uri,
    String,
    String?,
  )?
              f) =>
      super.noSuchMethod(
        Invocation.setter(
          #authenticate,
          f,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set connectionFactory(
          _i17.Future<_i15.ConnectionTask<_i15.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(
          _i17.Future<bool> Function(
    String,
    int,
    String,
    String?,
  )?
              f) =>
      super.noSuchMethod(
        Invocation.setter(
          #authenticateProxy,
          f,
        ),
        returnValueForMissingStub: null,
      );
  @override
  set badCertificateCallback(
          bool Function(
    _i15.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
  _i17.Future<_i15.HttpClientRequest> open(
    String? method,
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #open,
          [
            method,
            host,
            port,
            path,
          ],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #open,
            [
              method,
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> openUrl(
    String? method,
    Uri? url,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #openUrl,
          [
            method,
            url,
          ],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #openUrl,
            [
              method,
              url,
            ],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> get(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #get,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> getUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #getUrl,
          [url],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #getUrl,
            [url],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> post(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #post,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #post,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> postUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #postUrl,
          [url],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #postUrl,
            [url],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> put(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #put,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #put,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> putUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #putUrl,
          [url],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #putUrl,
            [url],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> delete(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #delete,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #delete,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> deleteUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #deleteUrl,
          [url],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #deleteUrl,
            [url],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> patch(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #patch,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #patch,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> patchUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #patchUrl,
          [url],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #patchUrl,
            [url],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> head(
    String? host,
    int? port,
    String? path,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #head,
          [
            host,
            port,
            path,
          ],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #head,
            [
              host,
              port,
              path,
            ],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  _i17.Future<_i15.HttpClientRequest> headUrl(Uri? url) => (super.noSuchMethod(
        Invocation.method(
          #headUrl,
          [url],
        ),
        returnValue: _i17.Future<_i15.HttpClientRequest>.value(_FakeHttpClientRequest_37(
          this,
          Invocation.method(
            #headUrl,
            [url],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientRequest>);
  @override
  void addCredentials(
    Uri? url,
    String? realm,
    _i15.HttpClientCredentials? credentials,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #addCredentials,
          [
            url,
            realm,
            credentials,
          ],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void addProxyCredentials(
    String? host,
    int? port,
    String? realm,
    _i15.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 _i15.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: '',
      ) as String);
  @override
  Uri get uri => (super.noSuchMethod(
        Invocation.getter(#uri),
        returnValue: _FakeUri_38(
          this,
          Invocation.getter(#uri),
        ),
      ) as Uri);
  @override
  _i15.HttpHeaders get headers => (super.noSuchMethod(
        Invocation.getter(#headers),
        returnValue: _FakeHttpHeaders_39(
          this,
          Invocation.getter(#headers),
        ),
      ) as _i15.HttpHeaders);
  @override
  List<_i15.Cookie> get cookies => (super.noSuchMethod(
        Invocation.getter(#cookies),
        returnValue: <_i15.Cookie>[],
      ) as List<_i15.Cookie>);
  @override
  _i17.Future<_i15.HttpClientResponse> get done => (super.noSuchMethod(
        Invocation.getter(#done),
        returnValue: _i17.Future<_i15.HttpClientResponse>.value(_FakeHttpClientResponse_40(
          this,
          Invocation.getter(#done),
        )),
      ) as _i17.Future<_i15.HttpClientResponse>);
  @override
  _i16.Encoding get encoding => (super.noSuchMethod(
        Invocation.getter(#encoding),
        returnValue: _FakeEncoding_41(
          this,
          Invocation.getter(#encoding),
        ),
      ) as _i16.Encoding);
  @override
  set encoding(_i16.Encoding? _encoding) => super.noSuchMethod(
        Invocation.setter(
          #encoding,
          _encoding,
        ),
        returnValueForMissingStub: null,
      );
  @override
  _i17.Future<_i15.HttpClientResponse> close() => (super.noSuchMethod(
        Invocation.method(
          #close,
          [],
        ),
        returnValue: _i17.Future<_i15.HttpClientResponse>.value(_FakeHttpClientResponse_40(
          this,
          Invocation.method(
            #close,
            [],
          ),
        )),
      ) as _i17.Future<_i15.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
  _i17.Future<dynamic> addStream(_i17.Stream<List<int>>? stream) => (super.noSuchMethod(
        Invocation.method(
          #addStream,
          [stream],
        ),
        returnValue: _i17.Future<dynamic>.value(),
      ) as _i17.Future<dynamic>);
  @override
  _i17.Future<dynamic> flush() => (super.noSuchMethod(
        Invocation.method(
          #flush,
          [],
        ),
        returnValue: _i17.Future<dynamic>.value(),
      ) as _i17.Future<dynamic>);
}

/// A class which mocks [HttpClientResponse].
///
/// See the documentation for Mockito's code generation for more information.
class MockHttpClientResponse extends _i1.Mock implements _i15.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: '',
      ) as String);
  @override
  int get contentLength => (super.noSuchMethod(
        Invocation.getter(#contentLength),
        returnValue: 0,
      ) as int);
  @override
  _i15.HttpClientResponseCompressionState get compressionState => (super.noSuchMethod(
        Invocation.getter(#compressionState),
        returnValue: _i15.HttpClientResponseCompressionState.notCompressed,
      ) as _i15.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<_i15.RedirectInfo> get redirects => (super.noSuchMethod(
        Invocation.getter(#redirects),
        returnValue: <_i15.RedirectInfo>[],
      ) as List<_i15.RedirectInfo>);
  @override
  _i15.HttpHeaders get headers => (super.noSuchMethod(
        Invocation.getter(#headers),
        returnValue: _FakeHttpHeaders_39(
          this,
          Invocation.getter(#headers),
        ),
      ) as _i15.HttpHeaders);
  @override
  List<_i15.Cookie> get cookies => (super.noSuchMethod(
        Invocation.getter(#cookies),
        returnValue: <_i15.Cookie>[],
      ) as List<_i15.Cookie>);
  @override
  bool get isBroadcast => (super.noSuchMethod(
        Invocation.getter(#isBroadcast),
        returnValue: false,
      ) as bool);
  @override
  _i17.Future<int> get length => (super.noSuchMethod(
        Invocation.getter(#length),
        returnValue: _i17.Future<int>.value(0),
      ) as _i17.Future<int>);
  @override
  _i17.Future<bool> get isEmpty => (super.noSuchMethod(
        Invocation.getter(#isEmpty),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<List<int>> get first => (super.noSuchMethod(
        Invocation.getter(#first),
        returnValue: _i17.Future<List<int>>.value(<int>[]),
      ) as _i17.Future<List<int>>);
  @override
  _i17.Future<List<int>> get last => (super.noSuchMethod(
        Invocation.getter(#last),
        returnValue: _i17.Future<List<int>>.value(<int>[]),
      ) as _i17.Future<List<int>>);
  @override
  _i17.Future<List<int>> get single => (super.noSuchMethod(
        Invocation.getter(#single),
        returnValue: _i17.Future<List<int>>.value(<int>[]),
      ) as _i17.Future<List<int>>);
  @override
  _i17.Future<_i15.HttpClientResponse> redirect([
    String? method,
    Uri? url,
    bool? followLoops,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #redirect,
          [
            method,
            url,
            followLoops,
          ],
        ),
        returnValue: _i17.Future<_i15.HttpClientResponse>.value(_FakeHttpClientResponse_40(
          this,
          Invocation.method(
            #redirect,
            [
              method,
              url,
              followLoops,
            ],
          ),
        )),
      ) as _i17.Future<_i15.HttpClientResponse>);
  @override
  _i17.Future<_i15.Socket> detachSocket() => (super.noSuchMethod(
        Invocation.method(
          #detachSocket,
          [],
        ),
        returnValue: _i17.Future<_i15.Socket>.value(_FakeSocket_42(
          this,
          Invocation.method(
            #detachSocket,
            [],
          ),
        )),
      ) as _i17.Future<_i15.Socket>);
  @override
  _i17.Stream<List<int>> asBroadcastStream({
    void Function(_i17.StreamSubscription<List<int>>)? onListen,
    void Function(_i17.StreamSubscription<List<int>>)? onCancel,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #asBroadcastStream,
          [],
          {
            #onListen: onListen,
            #onCancel: onCancel,
          },
        ),
        returnValue: _i17.Stream<List<int>>.empty(),
      ) as _i17.Stream<List<int>>);
  @override
  _i17.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_43<List<int>>(
          this,
          Invocation.method(
            #listen,
            [onData],
            {
              #onError: onError,
              #onDone: onDone,
              #cancelOnError: cancelOnError,
            },
          ),
        ),
      ) as _i17.StreamSubscription<List<int>>);
  @override
  _i17.Stream<List<int>> where(bool Function(List<int>)? test) => (super.noSuchMethod(
        Invocation.method(
          #where,
          [test],
        ),
        returnValue: _i17.Stream<List<int>>.empty(),
      ) as _i17.Stream<List<int>>);
  @override
  _i17.Stream<S> map<S>(S Function(List<int>)? convert) => (super.noSuchMethod(
        Invocation.method(
          #map,
          [convert],
        ),
        returnValue: _i17.Stream<S>.empty(),
      ) as _i17.Stream<S>);
  @override
  _i17.Stream<E> asyncMap<E>(_i17.FutureOr<E> Function(List<int>)? convert) => (super.noSuchMethod(
        Invocation.method(
          #asyncMap,
          [convert],
        ),
        returnValue: _i17.Stream<E>.empty(),
      ) as _i17.Stream<E>);
  @override
  _i17.Stream<E> asyncExpand<E>(_i17.Stream<E>? Function(List<int>)? convert) => (super.noSuchMethod(
        Invocation.method(
          #asyncExpand,
          [convert],
        ),
        returnValue: _i17.Stream<E>.empty(),
      ) as _i17.Stream<E>);
  @override
  _i17.Stream<List<int>> handleError(
    Function? onError, {
    bool Function(dynamic)? test,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #handleError,
          [onError],
          {#test: test},
        ),
        returnValue: _i17.Stream<List<int>>.empty(),
      ) as _i17.Stream<List<int>>);
  @override
  _i17.Stream<S> expand<S>(Iterable<S> Function(List<int>)? convert) => (super.noSuchMethod(
        Invocation.method(
          #expand,
          [convert],
        ),
        returnValue: _i17.Stream<S>.empty(),
      ) as _i17.Stream<S>);
  @override
  _i17.Future<dynamic> pipe(_i17.StreamConsumer<List<int>>? streamConsumer) => (super.noSuchMethod(
        Invocation.method(
          #pipe,
          [streamConsumer],
        ),
        returnValue: _i17.Future<dynamic>.value(),
      ) as _i17.Future<dynamic>);
  @override
  _i17.Stream<S> transform<S>(_i17.StreamTransformer<List<int>, S>? streamTransformer) => (super.noSuchMethod(
        Invocation.method(
          #transform,
          [streamTransformer],
        ),
        returnValue: _i17.Stream<S>.empty(),
      ) as _i17.Stream<S>);
  @override
  _i17.Future<List<int>> reduce(
          List<int> Function(
    List<int>,
    List<int>,
  )?
              combine) =>
      (super.noSuchMethod(
        Invocation.method(
          #reduce,
          [combine],
        ),
        returnValue: _i17.Future<List<int>>.value(<int>[]),
      ) as _i17.Future<List<int>>);
  @override
  _i17.Future<S> fold<S>(
    S? initialValue,
    S Function(
      S,
      List<int>,
    )?
        combine,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #fold,
          [
            initialValue,
            combine,
          ],
        ),
        returnValue: _i17.Future<S>.value(null),
      ) as _i17.Future<S>);
  @override
  _i17.Future<String> join([String? separator = r'']) => (super.noSuchMethod(
        Invocation.method(
          #join,
          [separator],
        ),
        returnValue: _i17.Future<String>.value(''),
      ) as _i17.Future<String>);
  @override
  _i17.Future<bool> contains(Object? needle) => (super.noSuchMethod(
        Invocation.method(
          #contains,
          [needle],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<dynamic> forEach(void Function(List<int>)? action) => (super.noSuchMethod(
        Invocation.method(
          #forEach,
          [action],
        ),
        returnValue: _i17.Future<dynamic>.value(),
      ) as _i17.Future<dynamic>);
  @override
  _i17.Future<bool> every(bool Function(List<int>)? test) => (super.noSuchMethod(
        Invocation.method(
          #every,
          [test],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<bool> any(bool Function(List<int>)? test) => (super.noSuchMethod(
        Invocation.method(
          #any,
          [test],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<R> cast<R>() => (super.noSuchMethod(
        Invocation.method(
          #cast,
          [],
        ),
        returnValue: _i17.Stream<R>.empty(),
      ) as _i17.Stream<R>);
  @override
  _i17.Future<List<List<int>>> toList() => (super.noSuchMethod(
        Invocation.method(
          #toList,
          [],
        ),
        returnValue: _i17.Future<List<List<int>>>.value(<List<int>>[]),
      ) as _i17.Future<List<List<int>>>);
  @override
  _i17.Future<Set<List<int>>> toSet() => (super.noSuchMethod(
        Invocation.method(
          #toSet,
          [],
        ),
        returnValue: _i17.Future<Set<List<int>>>.value(<List<int>>{}),
      ) as _i17.Future<Set<List<int>>>);
  @override
  _i17.Future<E> drain<E>([E? futureValue]) => (super.noSuchMethod(
        Invocation.method(
          #drain,
          [futureValue],
        ),
        returnValue: _i17.Future<E>.value(null),
      ) as _i17.Future<E>);
  @override
  _i17.Stream<List<int>> take(int? count) => (super.noSuchMethod(
        Invocation.method(
          #take,
          [count],
        ),
        returnValue: _i17.Stream<List<int>>.empty(),
      ) as _i17.Stream<List<int>>);
  @override
  _i17.Stream<List<int>> takeWhile(bool Function(List<int>)? test) => (super.noSuchMethod(
        Invocation.method(
          #takeWhile,
          [test],
        ),
        returnValue: _i17.Stream<List<int>>.empty(),
      ) as _i17.Stream<List<int>>);
  @override
  _i17.Stream<List<int>> skip(int? count) => (super.noSuchMethod(
        Invocation.method(
          #skip,
          [count],
        ),
        returnValue: _i17.Stream<List<int>>.empty(),
      ) as _i17.Stream<List<int>>);
  @override
  _i17.Stream<List<int>> skipWhile(bool Function(List<int>)? test) => (super.noSuchMethod(
        Invocation.method(
          #skipWhile,
          [test],
        ),
        returnValue: _i17.Stream<List<int>>.empty(),
      ) as _i17.Stream<List<int>>);
  @override
  _i17.Stream<List<int>> distinct(
          [bool Function(
            List<int>,
            List<int>,
          )?
              equals]) =>
      (super.noSuchMethod(
        Invocation.method(
          #distinct,
          [equals],
        ),
        returnValue: _i17.Stream<List<int>>.empty(),
      ) as _i17.Stream<List<int>>);
  @override
  _i17.Future<List<int>> firstWhere(
    bool Function(List<int>)? test, {
    List<int> Function()? orElse,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #firstWhere,
          [test],
          {#orElse: orElse},
        ),
        returnValue: _i17.Future<List<int>>.value(<int>[]),
      ) as _i17.Future<List<int>>);
  @override
  _i17.Future<List<int>> lastWhere(
    bool Function(List<int>)? test, {
    List<int> Function()? orElse,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #lastWhere,
          [test],
          {#orElse: orElse},
        ),
        returnValue: _i17.Future<List<int>>.value(<int>[]),
      ) as _i17.Future<List<int>>);
  @override
  _i17.Future<List<int>> singleWhere(
    bool Function(List<int>)? test, {
    List<int> Function()? orElse,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #singleWhere,
          [test],
          {#orElse: orElse},
        ),
        returnValue: _i17.Future<List<int>>.value(<int>[]),
      ) as _i17.Future<List<int>>);
  @override
  _i17.Future<List<int>> elementAt(int? index) => (super.noSuchMethod(
        Invocation.method(
          #elementAt,
          [index],
        ),
        returnValue: _i17.Future<List<int>>.value(<int>[]),
      ) as _i17.Future<List<int>>);
  @override
  _i17.Stream<List<int>> timeout(
    Duration? timeLimit, {
    void Function(_i17.EventSink<List<int>>)? onTimeout,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #timeout,
          [timeLimit],
          {#onTimeout: onTimeout},
        ),
        returnValue: _i17.Stream<List<int>>.empty(),
      ) as _i17.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
  _i17.Future<_i6.JobCancelResponse> cancel(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #cancel,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i17.Future<_i6.JobCancelResponse>.value(_FakeJobCancelResponse_44(
          this,
          Invocation.method(
            #cancel,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i17.Future<_i6.JobCancelResponse>);
  @override
  _i17.Future<void> delete(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #delete,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<_i6.Job> get(
    String? projectId,
    String? jobId, {
    String? location,
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            projectId,
            jobId,
          ],
          {
            #location: location,
            #$fields: $fields,
          },
        ),
        returnValue: _i17.Future<_i6.Job>.value(_FakeJob_45(
          this,
          Invocation.method(
            #get,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i17.Future<_i6.Job>);
  @override
  _i17.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: _i17.Future<_i6.GetQueryResultsResponse>.value(_FakeGetQueryResultsResponse_46(
          this,
          Invocation.method(
            #getQueryResults,
            [
              projectId,
              jobId,
            ],
            {
              #location: location,
              #maxResults: maxResults,
              #pageToken: pageToken,
              #startIndex: startIndex,
              #timeoutMs: timeoutMs,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i17.Future<_i6.GetQueryResultsResponse>);
  @override
  _i17.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: _i17.Future<_i6.Job>.value(_FakeJob_45(
          this,
          Invocation.method(
            #insert,
            [
              request,
              projectId,
            ],
            {
              #$fields: $fields,
              #uploadOptions: uploadOptions,
              #uploadMedia: uploadMedia,
            },
          ),
        )),
      ) as _i17.Future<_i6.Job>);
  @override
  _i17.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: _i17.Future<_i6.JobList>.value(_FakeJobList_47(
          this,
          Invocation.method(
            #list,
            [projectId],
            {
              #allUsers: allUsers,
              #maxCreationTime: maxCreationTime,
              #maxResults: maxResults,
              #minCreationTime: minCreationTime,
              #pageToken: pageToken,
              #parentJobId: parentJobId,
              #projection: projection,
              #stateFilter: stateFilter,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i17.Future<_i6.JobList>);
  @override
  _i17.Future<_i6.QueryResponse> query(
    _i6.QueryRequest? request,
    String? projectId, {
    String? $fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #query,
          [
            request,
            projectId,
          ],
          {#$fields: $fields},
        ),
        returnValue: _i17.Future<_i6.QueryResponse>.value(_FakeQueryResponse_48(
          this,
          Invocation.method(
            #query,
            [
              request,
              projectId,
            ],
            {#$fields: $fields},
          ),
        )),
      ) as _i17.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 _i31.LuciBuildService {
  MockLuciBuildService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i18.BuildBucketClient get buildBucketClient => (super.noSuchMethod(
        Invocation.getter(#buildBucketClient),
        returnValue: _FakeBuildBucketClient_49(
          this,
          Invocation.getter(#buildBucketClient),
        ),
      ) as _i18.BuildBucketClient);
  @override
  set buildBucketClient(_i18.BuildBucketClient? _buildBucketClient) => super.noSuchMethod(
        Invocation.setter(
          #buildBucketClient,
          _buildBucketClient,
        ),
        returnValueForMissingStub: null,
      );
  @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
  _i11.GithubChecksUtil get githubChecksUtil => (super.noSuchMethod(
        Invocation.getter(#githubChecksUtil),
        returnValue: _FakeGithubChecksUtil_17(
          this,
          Invocation.getter(#githubChecksUtil),
        ),
      ) as _i11.GithubChecksUtil);
  @override
  set githubChecksUtil(_i11.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
  _i19.PubSub get pubsub => (super.noSuchMethod(
        Invocation.getter(#pubsub),
        returnValue: _FakePubSub_50(
          this,
          Invocation.getter(#pubsub),
        ),
      ) as _i19.PubSub);
  @override
  _i17.Future<List<List<_i9.Request>>> shard(
    List<_i9.Request>? requests,
    int? max,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #shard,
          [
            requests,
            max,
          ],
        ),
        returnValue: _i17.Future<List<List<_i9.Request>>>.value(<List<_i9.Request>>[]),
      ) as _i17.Future<List<List<_i9.Request>>>);
  @override
  _i17.Future<Iterable<_i9.Build>> getTryBuilds(
    _i10.RepositorySlug? slug,
    String? sha,
    String? builderName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getTryBuilds,
          [
            slug,
            sha,
            builderName,
          ],
        ),
        returnValue: _i17.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
      ) as _i17.Future<Iterable<_i9.Build>>);
  @override
  _i17.Future<Iterable<_i9.Build>> getProdBuilds(
    _i10.RepositorySlug? slug,
    String? commitSha,
    String? builderName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getProdBuilds,
          [
            slug,
            commitSha,
            builderName,
          ],
        ),
        returnValue: _i17.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
      ) as _i17.Future<Iterable<_i9.Build>>);
  @override
  _i17.Future<Iterable<_i9.Build>> getBuilds(
    _i10.RepositorySlug? slug,
    String? commitSha,
    String? builderName,
    String? bucket,
    Map<String, List<String>>? tags,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuilds,
          [
            slug,
            commitSha,
            builderName,
            bucket,
            tags,
          ],
        ),
        returnValue: _i17.Future<Iterable<_i9.Build>>.value(<_i9.Build>[]),
      ) as _i17.Future<Iterable<_i9.Build>>);
  @override
  _i17.Future<Map<String?, _i9.Build?>> tryBuildsForPullRequest(_i10.PullRequest? pullRequest) => (super.noSuchMethod(
        Invocation.method(
          #tryBuildsForPullRequest,
          [pullRequest],
        ),
        returnValue: _i17.Future<Map<String?, _i9.Build?>>.value(<String?, _i9.Build?>{}),
      ) as _i17.Future<Map<String?, _i9.Build?>>);
  @override
  _i17.Future<List<_i32.Target>> scheduleTryBuilds({
    required List<_i32.Target>? targets,
    required _i10.PullRequest? pullRequest,
    _i24.CheckSuiteEvent? checkSuiteEvent,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #scheduleTryBuilds,
          [],
          {
            #targets: targets,
            #pullRequest: pullRequest,
            #checkSuiteEvent: checkSuiteEvent,
          },
        ),
        returnValue: _i17.Future<List<_i32.Target>>.value(<_i32.Target>[]),
      ) as _i17.Future<List<_i32.Target>>);
  @override
  _i17.Future<void> cancelBuilds(
    _i10.PullRequest? pullRequest,
    String? reason,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #cancelBuilds,
          [
            pullRequest,
            reason,
          ],
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<List<_i9.Build?>> failedBuilds(
    _i10.PullRequest? pullRequest,
    List<_i32.Target>? targets,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #failedBuilds,
          [
            pullRequest,
            targets,
          ],
        ),
        returnValue: _i17.Future<List<_i9.Build?>>.value(<_i9.Build?>[]),
      ) as _i17.Future<List<_i9.Build?>>);
  @override
  _i17.Future<_i9.Build> rescheduleBuild({
    required String? commitSha,
    required String? builderName,
    required _i30.BuildPushMessage? buildPushMessage,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #rescheduleBuild,
          [],
          {
            #commitSha: commitSha,
            #builderName: builderName,
            #buildPushMessage: buildPushMessage,
          },
        ),
        returnValue: _i17.Future<_i9.Build>.value(_FakeBuild_8(
          this,
          Invocation.method(
            #rescheduleBuild,
            [],
            {
              #commitSha: commitSha,
              #builderName: builderName,
              #buildPushMessage: buildPushMessage,
            },
          ),
        )),
      ) as _i17.Future<_i9.Build>);
  @override
  _i17.Future<_i9.Build> rescheduleUsingCheckRunEvent(_i33.CheckRunEvent? checkRunEvent) => (super.noSuchMethod(
        Invocation.method(
          #rescheduleUsingCheckRunEvent,
          [checkRunEvent],
        ),
        returnValue: _i17.Future<_i9.Build>.value(_FakeBuild_8(
          this,
          Invocation.method(
            #rescheduleUsingCheckRunEvent,
            [checkRunEvent],
          ),
        )),
      ) as _i17.Future<_i9.Build>);
  @override
  _i17.Future<_i9.Build> getBuildById(
    String? id, {
    String? fields,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBuildById,
          [id],
          {#fields: fields},
        ),
        returnValue: _i17.Future<_i9.Build>.value(_FakeBuild_8(
          this,
          Invocation.method(
            #getBuildById,
            [id],
            {#fields: fields},
          ),
        )),
      ) as _i17.Future<_i9.Build>);
  @override
  _i17.Future<Set<String>> getAvailableBuilderSet({
    String? project = r'flutter',
    String? bucket = r'prod',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getAvailableBuilderSet,
          [],
          {
            #project: project,
            #bucket: bucket,
          },
        ),
        returnValue: _i17.Future<Set<String>>.value(<String>{}),
      ) as _i17.Future<Set<String>>);
  @override
  _i17.Future<void> schedulePostsubmitBuilds({
    required _i34.Commit? commit,
    required List<_i35.Tuple<_i32.Target, _i36.Task, int>>? toBeScheduled,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #schedulePostsubmitBuilds,
          [],
          {
            #commit: commit,
            #toBeScheduled: toBeScheduled,
          },
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<void> createPostsubmitCheckRun(
    _i34.Commit? commit,
    _i32.Target? target,
    Map<String, dynamic>? rawUserData,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createPostsubmitCheckRun,
          [
            commit,
            target,
            rawUserData,
          ],
        ),
        returnValue: _i17.Future<void>.value(),
        returnValueForMissingStub: _i17.Future<void>.value(),
      ) as _i17.Future<void>);
  @override
  _i17.Future<bool> checkRerunBuilder({
    required _i34.Commit? commit,
    required _i32.Target? target,
    required _i36.Task? task,
    required _i37.DatastoreService? datastore,
    Map<String, List<String>>? tags,
    bool? ignoreChecks = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #checkRerunBuilder,
          [],
          {
            #commit: commit,
            #target: target,
            #task: task,
            #datastore: datastore,
            #tags: tags,
            #ignoreChecks: ignoreChecks,
          },
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
}

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

  @override
  _i17.Future<_i15.Process> start(
    List<Object>? command, {
    String? workingDirectory,
    Map<String, String>? environment,
    bool? includeParentEnvironment = true,
    bool? runInShell = false,
    _i15.ProcessStartMode? mode = _i15.ProcessStartMode.normal,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #start,
          [command],
          {
            #workingDirectory: workingDirectory,
            #environment: environment,
            #includeParentEnvironment: includeParentEnvironment,
            #runInShell: runInShell,
            #mode: mode,
          },
        ),
        returnValue: _i17.Future<_i15.Process>.value(_FakeProcess_51(
          this,
          Invocation.method(
            #start,
            [command],
            {
              #workingDirectory: workingDirectory,
              #environment: environment,
              #includeParentEnvironment: includeParentEnvironment,
              #runInShell: runInShell,
              #mode: mode,
            },
          ),
        )),
      ) as _i17.Future<_i15.Process>);
  @override
  _i17.Future<_i15.ProcessResult> run(
    List<Object>? command, {
    String? workingDirectory,
    Map<String, String>? environment,
    bool? includeParentEnvironment = true,
    bool? runInShell = false,
    _i16.Encoding? stdoutEncoding = const _i15.SystemEncoding(),
    _i16.Encoding? stderrEncoding = const _i15.SystemEncoding(),
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #run,
          [command],
          {
            #workingDirectory: workingDirectory,
            #environment: environment,
            #includeParentEnvironment: includeParentEnvironment,
            #runInShell: runInShell,
            #stdoutEncoding: stdoutEncoding,
            #stderrEncoding: stderrEncoding,
          },
        ),
        returnValue: _i17.Future<_i15.ProcessResult>.value(_FakeProcessResult_52(
          this,
          Invocation.method(
            #run,
            [command],
            {
              #workingDirectory: workingDirectory,
              #environment: environment,
              #includeParentEnvironment: includeParentEnvironment,
              #runInShell: runInShell,
              #stdoutEncoding: stdoutEncoding,
              #stderrEncoding: stderrEncoding,
            },
          ),
        )),
      ) as _i17.Future<_i15.ProcessResult>);
  @override
  _i15.ProcessResult runSync(
    List<Object>? command, {
    String? workingDirectory,
    Map<String, String>? environment,
    bool? includeParentEnvironment = true,
    bool? runInShell = false,
    _i16.Encoding? stdoutEncoding = const _i15.SystemEncoding(),
    _i16.Encoding? stderrEncoding = const _i15.SystemEncoding(),
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #runSync,
          [command],
          {
            #workingDirectory: workingDirectory,
            #environment: environment,
            #includeParentEnvironment: includeParentEnvironment,
            #runInShell: runInShell,
            #stdoutEncoding: stdoutEncoding,
            #stderrEncoding: stderrEncoding,
          },
        ),
        returnValue: _FakeProcessResult_52(
          this,
          Invocation.method(
            #runSync,
            [command],
            {
              #workingDirectory: workingDirectory,
              #environment: environment,
              #includeParentEnvironment: includeParentEnvironment,
              #runInShell: runInShell,
              #stdoutEncoding: stdoutEncoding,
              #stderrEncoding: stderrEncoding,
            },
          ),
        ),
      ) as _i15.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, [
    _i15.ProcessSignal? signal = _i15.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 _i10.PullRequestsService {
  MockPullRequestsService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i10.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_12(
          this,
          Invocation.getter(#github),
        ),
      ) as _i10.GitHub);
  @override
  _i17.Stream<_i10.PullRequest> list(
    _i10.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: _i17.Stream<_i10.PullRequest>.empty(),
      ) as _i17.Stream<_i10.PullRequest>);
  @override
  _i17.Future<_i10.PullRequest> get(
    _i10.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #get,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i17.Future<_i10.PullRequest>.value(_FakePullRequest_22(
          this,
          Invocation.method(
            #get,
            [
              slug,
              number,
            ],
          ),
        )),
      ) as _i17.Future<_i10.PullRequest>);
  @override
  _i17.Future<_i10.PullRequest> create(
    _i10.RepositorySlug? slug,
    _i10.CreatePullRequest? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #create,
          [
            slug,
            request,
          ],
        ),
        returnValue: _i17.Future<_i10.PullRequest>.value(_FakePullRequest_22(
          this,
          Invocation.method(
            #create,
            [
              slug,
              request,
            ],
          ),
        )),
      ) as _i17.Future<_i10.PullRequest>);
  @override
  _i17.Future<_i10.PullRequest> edit(
    _i10.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: _i17.Future<_i10.PullRequest>.value(_FakePullRequest_22(
          this,
          Invocation.method(
            #edit,
            [
              slug,
              number,
            ],
            {
              #title: title,
              #body: body,
              #state: state,
              #base: base,
            },
          ),
        )),
      ) as _i17.Future<_i10.PullRequest>);
  @override
  _i17.Stream<_i10.RepositoryCommit> listCommits(
    _i10.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommits,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i17.Stream<_i10.RepositoryCommit>.empty(),
      ) as _i17.Stream<_i10.RepositoryCommit>);
  @override
  _i17.Stream<_i10.PullRequestFile> listFiles(
    _i10.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listFiles,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i17.Stream<_i10.PullRequestFile>.empty(),
      ) as _i17.Stream<_i10.PullRequestFile>);
  @override
  _i17.Stream<_i10.PullRequestReview> listReviews(
    _i10.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReviews,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i17.Stream<_i10.PullRequestReview>.empty(),
      ) as _i17.Stream<_i10.PullRequestReview>);
  @override
  _i17.Future<bool> isMerged(
    _i10.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isMerged,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<_i10.PullRequestMerge> merge(
    _i10.RepositorySlug? slug,
    int? number, {
    String? message,
    _i10.MergeMethod? mergeMethod = _i10.MergeMethod.merge,
    String? requestSha,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #merge,
          [
            slug,
            number,
          ],
          {
            #message: message,
            #mergeMethod: mergeMethod,
            #requestSha: requestSha,
          },
        ),
        returnValue: _i17.Future<_i10.PullRequestMerge>.value(_FakePullRequestMerge_53(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              number,
            ],
            {
              #message: message,
              #mergeMethod: mergeMethod,
              #requestSha: requestSha,
            },
          ),
        )),
      ) as _i17.Future<_i10.PullRequestMerge>);
  @override
  _i17.Stream<_i10.PullRequestComment> listCommentsByPullRequest(
    _i10.RepositorySlug? slug,
    int? number,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listCommentsByPullRequest,
          [
            slug,
            number,
          ],
        ),
        returnValue: _i17.Stream<_i10.PullRequestComment>.empty(),
      ) as _i17.Stream<_i10.PullRequestComment>);
  @override
  _i17.Stream<_i10.PullRequestComment> listComments(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listComments,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.PullRequestComment>.empty(),
      ) as _i17.Stream<_i10.PullRequestComment>);
  @override
  _i17.Future<_i10.PullRequestComment> createComment(
    _i10.RepositorySlug? slug,
    int? number,
    _i10.CreatePullRequestComment? comment,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createComment,
          [
            slug,
            number,
            comment,
          ],
        ),
        returnValue: _i17.Future<_i10.PullRequestComment>.value(_FakePullRequestComment_54(
          this,
          Invocation.method(
            #createComment,
            [
              slug,
              number,
              comment,
            ],
          ),
        )),
      ) as _i17.Future<_i10.PullRequestComment>);
  @override
  _i17.Future<_i10.PullRequestReview> createReview(
    _i10.RepositorySlug? slug,
    _i10.CreatePullRequestReview? review,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createReview,
          [
            slug,
            review,
          ],
        ),
        returnValue: _i17.Future<_i10.PullRequestReview>.value(_FakePullRequestReview_55(
          this,
          Invocation.method(
            #createReview,
            [
              slug,
              review,
            ],
          ),
        )),
      ) as _i17.Future<_i10.PullRequestReview>);
}

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

  @override
  _i10.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_12(
          this,
          Invocation.getter(#github),
        ),
      ) as _i10.GitHub);
  @override
  _i17.Stream<_i10.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: _i17.Stream<_i10.Repository>.empty(),
      ) as _i17.Stream<_i10.Repository>);
  @override
  _i17.Stream<_i10.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: _i17.Stream<_i10.Repository>.empty(),
      ) as _i17.Stream<_i10.Repository>);
  @override
  _i17.Stream<_i10.Repository> listOrganizationRepositories(
    String? org, {
    String? type = r'all',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listOrganizationRepositories,
          [org],
          {#type: type},
        ),
        returnValue: _i17.Stream<_i10.Repository>.empty(),
      ) as _i17.Stream<_i10.Repository>);
  @override
  _i17.Stream<_i10.Repository> listPublicRepositories({
    int? limit = 50,
    DateTime? since,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listPublicRepositories,
          [],
          {
            #limit: limit,
            #since: since,
          },
        ),
        returnValue: _i17.Stream<_i10.Repository>.empty(),
      ) as _i17.Stream<_i10.Repository>);
  @override
  _i17.Future<_i10.Repository> createRepository(
    _i10.CreateRepository? repository, {
    String? org,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createRepository,
          [repository],
          {#org: org},
        ),
        returnValue: _i17.Future<_i10.Repository>.value(_FakeRepository_56(
          this,
          Invocation.method(
            #createRepository,
            [repository],
            {#org: org},
          ),
        )),
      ) as _i17.Future<_i10.Repository>);
  @override
  _i17.Future<_i10.LicenseDetails> getLicense(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLicense,
          [slug],
        ),
        returnValue: _i17.Future<_i10.LicenseDetails>.value(_FakeLicenseDetails_57(
          this,
          Invocation.method(
            #getLicense,
            [slug],
          ),
        )),
      ) as _i17.Future<_i10.LicenseDetails>);
  @override
  _i17.Future<_i10.Repository> getRepository(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getRepository,
          [slug],
        ),
        returnValue: _i17.Future<_i10.Repository>.value(_FakeRepository_56(
          this,
          Invocation.method(
            #getRepository,
            [slug],
          ),
        )),
      ) as _i17.Future<_i10.Repository>);
  @override
  _i17.Stream<_i10.Repository> getRepositories(List<_i10.RepositorySlug>? slugs) => (super.noSuchMethod(
        Invocation.method(
          #getRepositories,
          [slugs],
        ),
        returnValue: _i17.Stream<_i10.Repository>.empty(),
      ) as _i17.Stream<_i10.Repository>);
  @override
  _i17.Future<_i10.Repository> editRepository(
    _i10.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: _i17.Future<_i10.Repository>.value(_FakeRepository_56(
          this,
          Invocation.method(
            #editRepository,
            [slug],
            {
              #name: name,
              #description: description,
              #homepage: homepage,
              #private: private,
              #hasIssues: hasIssues,
              #hasWiki: hasWiki,
              #hasDownloads: hasDownloads,
            },
          ),
        )),
      ) as _i17.Future<_i10.Repository>);
  @override
  _i17.Future<bool> deleteRepository(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #deleteRepository,
          [slug],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.Contributor> listContributors(
    _i10.RepositorySlug? slug, {
    bool? anon = false,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listContributors,
          [slug],
          {#anon: anon},
        ),
        returnValue: _i17.Stream<_i10.Contributor>.empty(),
      ) as _i17.Stream<_i10.Contributor>);
  @override
  _i17.Stream<_i10.Team> listTeams(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listTeams,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.Team>.empty(),
      ) as _i17.Stream<_i10.Team>);
  @override
  _i17.Future<_i10.LanguageBreakdown> listLanguages(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listLanguages,
          [slug],
        ),
        returnValue: _i17.Future<_i10.LanguageBreakdown>.value(_FakeLanguageBreakdown_58(
          this,
          Invocation.method(
            #listLanguages,
            [slug],
          ),
        )),
      ) as _i17.Future<_i10.LanguageBreakdown>);
  @override
  _i17.Stream<_i10.Tag> listTags(
    _i10.RepositorySlug? slug, {
    int? page = 1,
    int? pages,
    int? perPage = 30,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listTags,
          [slug],
          {
            #page: page,
            #pages: pages,
            #perPage: perPage,
          },
        ),
        returnValue: _i17.Stream<_i10.Tag>.empty(),
      ) as _i17.Stream<_i10.Tag>);
  @override
  _i17.Stream<_i10.Branch> listBranches(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listBranches,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.Branch>.empty(),
      ) as _i17.Stream<_i10.Branch>);
  @override
  _i17.Future<_i10.Branch> getBranch(
    _i10.RepositorySlug? slug,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getBranch,
          [
            slug,
            branch,
          ],
        ),
        returnValue: _i17.Future<_i10.Branch>.value(_FakeBranch_59(
          this,
          Invocation.method(
            #getBranch,
            [
              slug,
              branch,
            ],
          ),
        )),
      ) as _i17.Future<_i10.Branch>);
  @override
  _i17.Stream<_i10.Collaborator> listCollaborators(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCollaborators,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.Collaborator>.empty(),
      ) as _i17.Stream<_i10.Collaborator>);
  @override
  _i17.Future<bool> isCollaborator(
    _i10.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<bool> addCollaborator(
    _i10.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #addCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<bool> removeCollaborator(
    _i10.RepositorySlug? slug,
    String? user,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeCollaborator,
          [
            slug,
            user,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.CommitComment> listSingleCommitComments(
    _i10.RepositorySlug? slug,
    _i10.RepositoryCommit? commit,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listSingleCommitComments,
          [
            slug,
            commit,
          ],
        ),
        returnValue: _i17.Stream<_i10.CommitComment>.empty(),
      ) as _i17.Stream<_i10.CommitComment>);
  @override
  _i17.Stream<_i10.CommitComment> listCommitComments(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommitComments,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.CommitComment>.empty(),
      ) as _i17.Stream<_i10.CommitComment>);
  @override
  _i17.Future<_i10.CommitComment> createCommitComment(
    _i10.RepositorySlug? slug,
    _i10.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: _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
          this,
          Invocation.method(
            #createCommitComment,
            [
              slug,
              commit,
            ],
            {
              #body: body,
              #path: path,
              #position: position,
              #line: line,
            },
          ),
        )),
      ) as _i17.Future<_i10.CommitComment>);
  @override
  _i17.Future<_i10.CommitComment> getCommitComment(
    _i10.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
          this,
          Invocation.method(
            #getCommitComment,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i17.Future<_i10.CommitComment>);
  @override
  _i17.Future<_i10.CommitComment> updateCommitComment(
    _i10.RepositorySlug? slug, {
    required int? id,
    required String? body,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #updateCommitComment,
          [slug],
          {
            #id: id,
            #body: body,
          },
        ),
        returnValue: _i17.Future<_i10.CommitComment>.value(_FakeCommitComment_60(
          this,
          Invocation.method(
            #updateCommitComment,
            [slug],
            {
              #id: id,
              #body: body,
            },
          ),
        )),
      ) as _i17.Future<_i10.CommitComment>);
  @override
  _i17.Future<bool> deleteCommitComment(
    _i10.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteCommitComment,
          [slug],
          {#id: id},
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.RepositoryCommit> listCommits(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommits,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.RepositoryCommit>.empty(),
      ) as _i17.Stream<_i10.RepositoryCommit>);
  @override
  _i17.Future<_i10.RepositoryCommit> getCommit(
    _i10.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommit,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i17.Future<_i10.RepositoryCommit>.value(_FakeRepositoryCommit_61(
          this,
          Invocation.method(
            #getCommit,
            [
              slug,
              sha,
            ],
          ),
        )),
      ) as _i17.Future<_i10.RepositoryCommit>);
  @override
  _i17.Future<String> getCommitDiff(
    _i10.RepositorySlug? slug,
    String? sha,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCommitDiff,
          [
            slug,
            sha,
          ],
        ),
        returnValue: _i17.Future<String>.value(''),
      ) as _i17.Future<String>);
  @override
  _i17.Future<_i10.GitHubComparison> compareCommits(
    _i10.RepositorySlug? slug,
    String? refBase,
    String? refHead,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #compareCommits,
          [
            slug,
            refBase,
            refHead,
          ],
        ),
        returnValue: _i17.Future<_i10.GitHubComparison>.value(_FakeGitHubComparison_62(
          this,
          Invocation.method(
            #compareCommits,
            [
              slug,
              refBase,
              refHead,
            ],
          ),
        )),
      ) as _i17.Future<_i10.GitHubComparison>);
  @override
  _i17.Future<_i10.GitHubFile> getReadme(
    _i10.RepositorySlug? slug, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReadme,
          [slug],
          {#ref: ref},
        ),
        returnValue: _i17.Future<_i10.GitHubFile>.value(_FakeGitHubFile_63(
          this,
          Invocation.method(
            #getReadme,
            [slug],
            {#ref: ref},
          ),
        )),
      ) as _i17.Future<_i10.GitHubFile>);
  @override
  _i17.Future<_i10.RepositoryContents> getContents(
    _i10.RepositorySlug? slug,
    String? path, {
    String? ref,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getContents,
          [
            slug,
            path,
          ],
          {#ref: ref},
        ),
        returnValue: _i17.Future<_i10.RepositoryContents>.value(_FakeRepositoryContents_64(
          this,
          Invocation.method(
            #getContents,
            [
              slug,
              path,
            ],
            {#ref: ref},
          ),
        )),
      ) as _i17.Future<_i10.RepositoryContents>);
  @override
  _i17.Future<_i10.ContentCreation> createFile(
    _i10.RepositorySlug? slug,
    _i10.CreateFile? file,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFile,
          [
            slug,
            file,
          ],
        ),
        returnValue: _i17.Future<_i10.ContentCreation>.value(_FakeContentCreation_65(
          this,
          Invocation.method(
            #createFile,
            [
              slug,
              file,
            ],
          ),
        )),
      ) as _i17.Future<_i10.ContentCreation>);
  @override
  _i17.Future<_i10.ContentCreation> updateFile(
    _i10.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: _i17.Future<_i10.ContentCreation>.value(_FakeContentCreation_65(
          this,
          Invocation.method(
            #updateFile,
            [
              slug,
              path,
              message,
              content,
              sha,
            ],
            {#branch: branch},
          ),
        )),
      ) as _i17.Future<_i10.ContentCreation>);
  @override
  _i17.Future<_i10.ContentCreation> deleteFile(
    _i10.RepositorySlug? slug,
    String? path,
    String? message,
    String? sha,
    String? branch,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteFile,
          [
            slug,
            path,
            message,
            sha,
            branch,
          ],
        ),
        returnValue: _i17.Future<_i10.ContentCreation>.value(_FakeContentCreation_65(
          this,
          Invocation.method(
            #deleteFile,
            [
              slug,
              path,
              message,
              sha,
              branch,
            ],
          ),
        )),
      ) as _i17.Future<_i10.ContentCreation>);
  @override
  _i17.Future<String?> getArchiveLink(
    _i10.RepositorySlug? slug,
    String? ref, {
    String? format = r'tarball',
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getArchiveLink,
          [
            slug,
            ref,
          ],
          {#format: format},
        ),
        returnValue: _i17.Future<String?>.value(),
      ) as _i17.Future<String?>);
  @override
  _i17.Stream<_i10.Repository> listForks(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listForks,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.Repository>.empty(),
      ) as _i17.Stream<_i10.Repository>);
  @override
  _i17.Future<_i10.Repository> createFork(
    _i10.RepositorySlug? slug, [
    _i10.CreateFork? fork,
  ]) =>
      (super.noSuchMethod(
        Invocation.method(
          #createFork,
          [
            slug,
            fork,
          ],
        ),
        returnValue: _i17.Future<_i10.Repository>.value(_FakeRepository_56(
          this,
          Invocation.method(
            #createFork,
            [
              slug,
              fork,
            ],
          ),
        )),
      ) as _i17.Future<_i10.Repository>);
  @override
  _i17.Stream<_i10.Hook> listHooks(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listHooks,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.Hook>.empty(),
      ) as _i17.Stream<_i10.Hook>);
  @override
  _i17.Future<_i10.Hook> getHook(
    _i10.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i17.Future<_i10.Hook>.value(_FakeHook_66(
          this,
          Invocation.method(
            #getHook,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i17.Future<_i10.Hook>);
  @override
  _i17.Future<_i10.Hook> createHook(
    _i10.RepositorySlug? slug,
    _i10.CreateHook? hook,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createHook,
          [
            slug,
            hook,
          ],
        ),
        returnValue: _i17.Future<_i10.Hook>.value(_FakeHook_66(
          this,
          Invocation.method(
            #createHook,
            [
              slug,
              hook,
            ],
          ),
        )),
      ) as _i17.Future<_i10.Hook>);
  @override
  _i17.Future<_i10.Hook> editHook(
    _i10.RepositorySlug? slug,
    _i10.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: _i17.Future<_i10.Hook>.value(_FakeHook_66(
          this,
          Invocation.method(
            #editHook,
            [
              slug,
              hookToEdit,
            ],
            {
              #configUrl: configUrl,
              #configContentType: configContentType,
              #configSecret: configSecret,
              #configInsecureSsl: configInsecureSsl,
              #events: events,
              #addEvents: addEvents,
              #removeEvents: removeEvents,
              #active: active,
            },
          ),
        )),
      ) as _i17.Future<_i10.Hook>);
  @override
  _i17.Future<bool> testPushHook(
    _i10.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #testPushHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<bool> pingHook(
    _i10.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #pingHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<bool> deleteHook(
    _i10.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteHook,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.PublicKey> listDeployKeys(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listDeployKeys,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.PublicKey>.empty(),
      ) as _i17.Stream<_i10.PublicKey>);
  @override
  _i17.Future<_i10.PublicKey> getDeployKey(
    _i10.RepositorySlug? slug, {
    required int? id,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getDeployKey,
          [slug],
          {#id: id},
        ),
        returnValue: _i17.Future<_i10.PublicKey>.value(_FakePublicKey_67(
          this,
          Invocation.method(
            #getDeployKey,
            [slug],
            {#id: id},
          ),
        )),
      ) as _i17.Future<_i10.PublicKey>);
  @override
  _i17.Future<_i10.PublicKey> createDeployKey(
    _i10.RepositorySlug? slug,
    _i10.CreatePublicKey? key,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createDeployKey,
          [
            slug,
            key,
          ],
        ),
        returnValue: _i17.Future<_i10.PublicKey>.value(_FakePublicKey_67(
          this,
          Invocation.method(
            #createDeployKey,
            [
              slug,
              key,
            ],
          ),
        )),
      ) as _i17.Future<_i10.PublicKey>);
  @override
  _i17.Future<bool> deleteDeployKey({
    required _i10.RepositorySlug? slug,
    required _i10.PublicKey? key,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteDeployKey,
          [],
          {
            #slug: slug,
            #key: key,
          },
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<_i10.RepositoryCommit> merge(
    _i10.RepositorySlug? slug,
    _i10.CreateMerge? merge,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #merge,
          [
            slug,
            merge,
          ],
        ),
        returnValue: _i17.Future<_i10.RepositoryCommit>.value(_FakeRepositoryCommit_61(
          this,
          Invocation.method(
            #merge,
            [
              slug,
              merge,
            ],
          ),
        )),
      ) as _i17.Future<_i10.RepositoryCommit>);
  @override
  _i17.Future<_i10.RepositoryPages> getPagesInfo(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getPagesInfo,
          [slug],
        ),
        returnValue: _i17.Future<_i10.RepositoryPages>.value(_FakeRepositoryPages_68(
          this,
          Invocation.method(
            #getPagesInfo,
            [slug],
          ),
        )),
      ) as _i17.Future<_i10.RepositoryPages>);
  @override
  _i17.Stream<_i10.PageBuild> listPagesBuilds(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listPagesBuilds,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.PageBuild>.empty(),
      ) as _i17.Stream<_i10.PageBuild>);
  @override
  _i17.Future<_i10.PageBuild> getLatestPagesBuild(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLatestPagesBuild,
          [slug],
        ),
        returnValue: _i17.Future<_i10.PageBuild>.value(_FakePageBuild_69(
          this,
          Invocation.method(
            #getLatestPagesBuild,
            [slug],
          ),
        )),
      ) as _i17.Future<_i10.PageBuild>);
  @override
  _i17.Stream<_i10.Release> listReleases(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listReleases,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.Release>.empty(),
      ) as _i17.Stream<_i10.Release>);
  @override
  _i17.Future<_i10.Release> getLatestRelease(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getLatestRelease,
          [slug],
        ),
        returnValue: _i17.Future<_i10.Release>.value(_FakeRelease_70(
          this,
          Invocation.method(
            #getLatestRelease,
            [slug],
          ),
        )),
      ) as _i17.Future<_i10.Release>);
  @override
  _i17.Future<_i10.Release> getReleaseById(
    _i10.RepositorySlug? slug,
    int? id,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseById,
          [
            slug,
            id,
          ],
        ),
        returnValue: _i17.Future<_i10.Release>.value(_FakeRelease_70(
          this,
          Invocation.method(
            #getReleaseById,
            [
              slug,
              id,
            ],
          ),
        )),
      ) as _i17.Future<_i10.Release>);
  @override
  _i17.Future<_i10.Release> getReleaseByTagName(
    _i10.RepositorySlug? slug,
    String? tagName,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseByTagName,
          [
            slug,
            tagName,
          ],
        ),
        returnValue: _i17.Future<_i10.Release>.value(_FakeRelease_70(
          this,
          Invocation.method(
            #getReleaseByTagName,
            [
              slug,
              tagName,
            ],
          ),
        )),
      ) as _i17.Future<_i10.Release>);
  @override
  _i17.Future<_i10.Release> createRelease(
    _i10.RepositorySlug? slug,
    _i10.CreateRelease? createRelease, {
    bool? getIfExists = true,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createRelease,
          [
            slug,
            createRelease,
          ],
          {#getIfExists: getIfExists},
        ),
        returnValue: _i17.Future<_i10.Release>.value(_FakeRelease_70(
          this,
          Invocation.method(
            #createRelease,
            [
              slug,
              createRelease,
            ],
            {#getIfExists: getIfExists},
          ),
        )),
      ) as _i17.Future<_i10.Release>);
  @override
  _i17.Future<_i10.Release> editRelease(
    _i10.RepositorySlug? slug,
    _i10.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: _i17.Future<_i10.Release>.value(_FakeRelease_70(
          this,
          Invocation.method(
            #editRelease,
            [
              slug,
              releaseToEdit,
            ],
            {
              #tagName: tagName,
              #targetCommitish: targetCommitish,
              #name: name,
              #body: body,
              #draft: draft,
              #preRelease: preRelease,
            },
          ),
        )),
      ) as _i17.Future<_i10.Release>);
  @override
  _i17.Future<bool> deleteRelease(
    _i10.RepositorySlug? slug,
    _i10.Release? release,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteRelease,
          [
            slug,
            release,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.ReleaseAsset> listReleaseAssets(
    _i10.RepositorySlug? slug,
    _i10.Release? release,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listReleaseAssets,
          [
            slug,
            release,
          ],
        ),
        returnValue: _i17.Stream<_i10.ReleaseAsset>.empty(),
      ) as _i17.Stream<_i10.ReleaseAsset>);
  @override
  _i17.Future<_i10.ReleaseAsset> getReleaseAsset(
    _i10.RepositorySlug? slug,
    _i10.Release? release, {
    required int? assetId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getReleaseAsset,
          [
            slug,
            release,
          ],
          {#assetId: assetId},
        ),
        returnValue: _i17.Future<_i10.ReleaseAsset>.value(_FakeReleaseAsset_71(
          this,
          Invocation.method(
            #getReleaseAsset,
            [
              slug,
              release,
            ],
            {#assetId: assetId},
          ),
        )),
      ) as _i17.Future<_i10.ReleaseAsset>);
  @override
  _i17.Future<_i10.ReleaseAsset> editReleaseAsset(
    _i10.RepositorySlug? slug,
    _i10.ReleaseAsset? assetToEdit, {
    String? name,
    String? label,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #editReleaseAsset,
          [
            slug,
            assetToEdit,
          ],
          {
            #name: name,
            #label: label,
          },
        ),
        returnValue: _i17.Future<_i10.ReleaseAsset>.value(_FakeReleaseAsset_71(
          this,
          Invocation.method(
            #editReleaseAsset,
            [
              slug,
              assetToEdit,
            ],
            {
              #name: name,
              #label: label,
            },
          ),
        )),
      ) as _i17.Future<_i10.ReleaseAsset>);
  @override
  _i17.Future<bool> deleteReleaseAsset(
    _i10.RepositorySlug? slug,
    _i10.ReleaseAsset? asset,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteReleaseAsset,
          [
            slug,
            asset,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<List<_i10.ReleaseAsset>> uploadReleaseAssets(
    _i10.Release? release,
    Iterable<_i10.CreateReleaseAsset>? createReleaseAssets,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #uploadReleaseAssets,
          [
            release,
            createReleaseAssets,
          ],
        ),
        returnValue: _i17.Future<List<_i10.ReleaseAsset>>.value(<_i10.ReleaseAsset>[]),
      ) as _i17.Future<List<_i10.ReleaseAsset>>);
  @override
  _i17.Future<List<_i10.ContributorStatistics>> listContributorStats(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listContributorStats,
          [slug],
        ),
        returnValue: _i17.Future<List<_i10.ContributorStatistics>>.value(<_i10.ContributorStatistics>[]),
      ) as _i17.Future<List<_i10.ContributorStatistics>>);
  @override
  _i17.Stream<_i10.YearCommitCountWeek> listCommitActivity(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCommitActivity,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.YearCommitCountWeek>.empty(),
      ) as _i17.Stream<_i10.YearCommitCountWeek>);
  @override
  _i17.Stream<_i10.WeeklyChangesCount> listCodeFrequency(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listCodeFrequency,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.WeeklyChangesCount>.empty(),
      ) as _i17.Stream<_i10.WeeklyChangesCount>);
  @override
  _i17.Future<_i10.ContributorParticipation> getParticipation(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #getParticipation,
          [slug],
        ),
        returnValue: _i17.Future<_i10.ContributorParticipation>.value(_FakeContributorParticipation_72(
          this,
          Invocation.method(
            #getParticipation,
            [slug],
          ),
        )),
      ) as _i17.Future<_i10.ContributorParticipation>);
  @override
  _i17.Stream<_i10.PunchcardEntry> listPunchcard(_i10.RepositorySlug? slug) => (super.noSuchMethod(
        Invocation.method(
          #listPunchcard,
          [slug],
        ),
        returnValue: _i17.Stream<_i10.PunchcardEntry>.empty(),
      ) as _i17.Stream<_i10.PunchcardEntry>);
  @override
  _i17.Stream<_i10.RepositoryStatus> listStatuses(
    _i10.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #listStatuses,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i17.Stream<_i10.RepositoryStatus>.empty(),
      ) as _i17.Stream<_i10.RepositoryStatus>);
  @override
  _i17.Future<_i10.RepositoryStatus> createStatus(
    _i10.RepositorySlug? slug,
    String? ref,
    _i10.CreateStatus? request,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #createStatus,
          [
            slug,
            ref,
            request,
          ],
        ),
        returnValue: _i17.Future<_i10.RepositoryStatus>.value(_FakeRepositoryStatus_73(
          this,
          Invocation.method(
            #createStatus,
            [
              slug,
              ref,
              request,
            ],
          ),
        )),
      ) as _i17.Future<_i10.RepositoryStatus>);
  @override
  _i17.Future<_i10.CombinedRepositoryStatus> getCombinedStatus(
    _i10.RepositorySlug? slug,
    String? ref,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCombinedStatus,
          [
            slug,
            ref,
          ],
        ),
        returnValue: _i17.Future<_i10.CombinedRepositoryStatus>.value(_FakeCombinedRepositoryStatus_74(
          this,
          Invocation.method(
            #getCombinedStatus,
            [
              slug,
              ref,
            ],
          ),
        )),
      ) as _i17.Future<_i10.CombinedRepositoryStatus>);
  @override
  _i17.Future<_i10.ReleaseNotes> generateReleaseNotes(_i10.CreateReleaseNotes? crn) => (super.noSuchMethod(
        Invocation.method(
          #generateReleaseNotes,
          [crn],
        ),
        returnValue: _i17.Future<_i10.ReleaseNotes>.value(_FakeReleaseNotes_75(
          this,
          Invocation.method(
            #generateReleaseNotes,
            [crn],
          ),
        )),
      ) as _i17.Future<_i10.ReleaseNotes>);
}

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

  @override
  _i10.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_12(
          this,
          Invocation.getter(#github),
        ),
      ) as _i10.GitHub);
  @override
  _i17.Stream<_i10.Repository> repositories(
    String? query, {
    String? sort,
    int? pages = 2,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #repositories,
          [query],
          {
            #sort: sort,
            #pages: pages,
          },
        ),
        returnValue: _i17.Stream<_i10.Repository>.empty(),
      ) as _i17.Stream<_i10.Repository>);
  @override
  _i17.Stream<_i10.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: _i17.Stream<_i10.CodeSearchResults>.empty(),
      ) as _i17.Stream<_i10.CodeSearchResults>);
  @override
  _i17.Stream<_i10.Issue> issues(
    String? query, {
    String? sort,
    int? pages = 2,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #issues,
          [query],
          {
            #sort: sort,
            #pages: pages,
          },
        ),
        returnValue: _i17.Stream<_i10.Issue>.empty(),
      ) as _i17.Stream<_i10.Issue>);
  @override
  _i17.Stream<_i10.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: _i17.Stream<_i10.User>.empty(),
      ) as _i17.Stream<_i10.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
  _i17.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: _i17.Future<_i6.TableDataInsertAllResponse>.value(_FakeTableDataInsertAllResponse_76(
          this,
          Invocation.method(
            #insertAll,
            [
              request,
              projectId,
              datasetId,
              tableId,
            ],
            {#$fields: $fields},
          ),
        )),
      ) as _i17.Future<_i6.TableDataInsertAllResponse>);
  @override
  _i17.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: _i17.Future<_i6.TableDataList>.value(_FakeTableDataList_77(
          this,
          Invocation.method(
            #list,
            [
              projectId,
              datasetId,
              tableId,
            ],
            {
              #maxResults: maxResults,
              #pageToken: pageToken,
              #selectedFields: selectedFields,
              #startIndex: startIndex,
              #$fields: $fields,
            },
          ),
        )),
      ) as _i17.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 _i10.UsersService {
  MockUsersService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i10.GitHub get github => (super.noSuchMethod(
        Invocation.getter(#github),
        returnValue: _FakeGitHub_12(
          this,
          Invocation.getter(#github),
        ),
      ) as _i10.GitHub);
  @override
  _i17.Future<_i10.User> getUser(String? name) => (super.noSuchMethod(
        Invocation.method(
          #getUser,
          [name],
        ),
        returnValue: _i17.Future<_i10.User>.value(_FakeUser_78(
          this,
          Invocation.method(
            #getUser,
            [name],
          ),
        )),
      ) as _i17.Future<_i10.User>);
  @override
  _i17.Future<_i10.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: _i17.Future<_i10.CurrentUser>.value(_FakeCurrentUser_79(
          this,
          Invocation.method(
            #editCurrentUser,
            [],
            {
              #name: name,
              #email: email,
              #blog: blog,
              #company: company,
              #location: location,
              #hireable: hireable,
              #bio: bio,
            },
          ),
        )),
      ) as _i17.Future<_i10.CurrentUser>);
  @override
  _i17.Stream<_i10.User> getUsers(
    List<String>? names, {
    int? pages,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getUsers,
          [names],
          {#pages: pages},
        ),
        returnValue: _i17.Stream<_i10.User>.empty(),
      ) as _i17.Stream<_i10.User>);
  @override
  _i17.Future<_i10.CurrentUser> getCurrentUser() => (super.noSuchMethod(
        Invocation.method(
          #getCurrentUser,
          [],
        ),
        returnValue: _i17.Future<_i10.CurrentUser>.value(_FakeCurrentUser_79(
          this,
          Invocation.method(
            #getCurrentUser,
            [],
          ),
        )),
      ) as _i17.Future<_i10.CurrentUser>);
  @override
  _i17.Future<bool> isUser(String? name) => (super.noSuchMethod(
        Invocation.method(
          #isUser,
          [name],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.User> listUsers({
    int? pages,
    int? since,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #listUsers,
          [],
          {
            #pages: pages,
            #since: since,
          },
        ),
        returnValue: _i17.Stream<_i10.User>.empty(),
      ) as _i17.Stream<_i10.User>);
  @override
  _i17.Stream<_i10.UserEmail> listEmails() => (super.noSuchMethod(
        Invocation.method(
          #listEmails,
          [],
        ),
        returnValue: _i17.Stream<_i10.UserEmail>.empty(),
      ) as _i17.Stream<_i10.UserEmail>);
  @override
  _i17.Stream<_i10.UserEmail> addEmails(List<String>? emails) => (super.noSuchMethod(
        Invocation.method(
          #addEmails,
          [emails],
        ),
        returnValue: _i17.Stream<_i10.UserEmail>.empty(),
      ) as _i17.Stream<_i10.UserEmail>);
  @override
  _i17.Future<bool> deleteEmails(List<String>? emails) => (super.noSuchMethod(
        Invocation.method(
          #deleteEmails,
          [emails],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.User> listUserFollowers(String? user) => (super.noSuchMethod(
        Invocation.method(
          #listUserFollowers,
          [user],
        ),
        returnValue: _i17.Stream<_i10.User>.empty(),
      ) as _i17.Stream<_i10.User>);
  @override
  _i17.Future<bool> isFollowingUser(String? user) => (super.noSuchMethod(
        Invocation.method(
          #isFollowingUser,
          [user],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<bool> isUserFollowing(
    String? user,
    String? target,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #isUserFollowing,
          [
            user,
            target,
          ],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<bool> followUser(String? user) => (super.noSuchMethod(
        Invocation.method(
          #followUser,
          [user],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Future<bool> unfollowUser(String? user) => (super.noSuchMethod(
        Invocation.method(
          #unfollowUser,
          [user],
        ),
        returnValue: _i17.Future<bool>.value(false),
      ) as _i17.Future<bool>);
  @override
  _i17.Stream<_i10.User> listCurrentUserFollowers() => (super.noSuchMethod(
        Invocation.method(
          #listCurrentUserFollowers,
          [],
        ),
        returnValue: _i17.Stream<_i10.User>.empty(),
      ) as _i17.Stream<_i10.User>);
  @override
  _i17.Stream<_i10.User> listCurrentUserFollowing() => (super.noSuchMethod(
        Invocation.method(
          #listCurrentUserFollowing,
          [],
        ),
        returnValue: _i17.Stream<_i10.User>.empty(),
      ) as _i17.Stream<_i10.User>);
  @override
  _i17.Stream<_i10.PublicKey> listPublicKeys([String? userLogin]) => (super.noSuchMethod(
        Invocation.method(
          #listPublicKeys,
          [userLogin],
        ),
        returnValue: _i17.Stream<_i10.PublicKey>.empty(),
      ) as _i17.Stream<_i10.PublicKey>);
  @override
  _i17.Future<_i10.PublicKey> createPublicKey(_i10.CreatePublicKey? key) => (super.noSuchMethod(
        Invocation.method(
          #createPublicKey,
          [key],
        ),
        returnValue: _i17.Future<_i10.PublicKey>.value(_FakePublicKey_67(
          this,
          Invocation.method(
            #createPublicKey,
            [key],
          ),
        )),
      ) as _i17.Future<_i10.PublicKey>);
}

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

  @override
  _i20.Entry<_i27.Uint8List> operator [](String? key) => (super.noSuchMethod(
        Invocation.method(
          #[],
          [key],
        ),
        returnValue: _FakeEntry_80<_i27.Uint8List>(
          this,
          Invocation.method(
            #[],
            [key],
          ),
        ),
      ) as _i20.Entry<_i27.Uint8List>);
  @override
  _i20.Cache<_i27.Uint8List> withPrefix(String? prefix) => (super.noSuchMethod(
        Invocation.method(
          #withPrefix,
          [prefix],
        ),
        returnValue: _FakeCache_81<_i27.Uint8List>(
          this,
          Invocation.method(
            #withPrefix,
            [prefix],
          ),
        ),
      ) as _i20.Cache<_i27.Uint8List>);
  @override
  _i20.Cache<S> withCodec<S>(_i16.Codec<S, _i27.Uint8List>? codec) => (super.noSuchMethod(
        Invocation.method(
          #withCodec,
          [codec],
        ),
        returnValue: _FakeCache_81<S>(
          this,
          Invocation.method(
            #withCodec,
            [codec],
          ),
        ),
      ) as _i20.Cache<S>);
  @override
  _i20.Cache<_i27.Uint8List> withTTL(Duration? ttl) => (super.noSuchMethod(
        Invocation.method(
          #withTTL,
          [ttl],
        ),
        returnValue: _FakeCache_81<_i27.Uint8List>(
          this,
          Invocation.method(
            #withTTL,
            [ttl],
          ),
        ),
      ) as _i20.Cache<_i27.Uint8List>);
}

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

  @override
  set auth(_i10.Authentication? _auth) => super.noSuchMethod(
        Invocation.setter(
          #auth,
          _auth,
        ),
        returnValueForMissingStub: null,
      );
  @override
  String get endpoint => (super.noSuchMethod(
        Invocation.getter(#endpoint),
        returnValue: '',
      ) as String);
  @override
  String get version => (super.noSuchMethod(
        Invocation.getter(#version),
        returnValue: '',
      ) as String);
  @override
  _i2.Client get client => (super.noSuchMethod(
        Invocation.getter(#client),
        returnValue: _FakeClient_0(
          this,
          Invocation.getter(#client),
        ),
      ) as _i2.Client);
  @override
  _i10.ActivityService get activity => (super.noSuchMethod(
        Invocation.getter(#activity),
        returnValue: _FakeActivityService_82(
          this,
          Invocation.getter(#activity),
        ),
      ) as _i10.ActivityService);
  @override
  _i10.AuthorizationsService get authorizations => (super.noSuchMethod(
        Invocation.getter(#authorizations),
        returnValue: _FakeAuthorizationsService_83(
          this,
          Invocation.getter(#authorizations),
        ),
      ) as _i10.AuthorizationsService);
  @override
  _i10.GistsService get gists => (super.noSuchMethod(
        Invocation.getter(#gists),
        returnValue: _FakeGistsService_84(
          this,
          Invocation.getter(#gists),
        ),
      ) as _i10.GistsService);
  @override
  _i10.GitService get git => (super.noSuchMethod(
        Invocation.getter(#git),
        returnValue: _FakeGitService_85(
          this,
          Invocation.getter(#git),
        ),
      ) as _i10.GitService);
  @override
  _i10.IssuesService get issues => (super.noSuchMethod(
        Invocation.getter(#issues),
        returnValue: _FakeIssuesService_86(
          this,
          Invocation.getter(#issues),
        ),
      ) as _i10.IssuesService);
  @override
  _i10.MiscService get misc => (super.noSuchMethod(
        Invocation.getter(#misc),
        returnValue: _FakeMiscService_87(
          this,
          Invocation.getter(#misc),
        ),
      ) as _i10.MiscService);
  @override
  _i10.OrganizationsService get organizations => (super.noSuchMethod(
        Invocation.getter(#organizations),
        returnValue: _FakeOrganizationsService_88(
          this,
          Invocation.getter(#organizations),
        ),
      ) as _i10.OrganizationsService);
  @override
  _i10.PullRequestsService get pullRequests => (super.noSuchMethod(
        Invocation.getter(#pullRequests),
        returnValue: _FakePullRequestsService_89(
          this,
          Invocation.getter(#pullRequests),
        ),
      ) as _i10.PullRequestsService);
  @override
  _i10.RepositoriesService get repositories => (super.noSuchMethod(
        Invocation.getter(#repositories),
        returnValue: _FakeRepositoriesService_90(
          this,
          Invocation.getter(#repositories),
        ),
      ) as _i10.RepositoriesService);
  @override
  _i10.SearchService get search => (super.noSuchMethod(
        Invocation.getter(#search),
        returnValue: _FakeSearchService_91(
          this,
          Invocation.getter(#search),
        ),
      ) as _i10.SearchService);
  @override
  _i10.UrlShortenerService get urlShortener => (super.noSuchMethod(
        Invocation.getter(#urlShortener),
        returnValue: _FakeUrlShortenerService_92(
          this,
          Invocation.getter(#urlShortener),
        ),
      ) as _i10.UrlShortenerService);
  @override
  _i10.UsersService get users => (super.noSuchMethod(
        Invocation.getter(#users),
        returnValue: _FakeUsersService_93(
          this,
          Invocation.getter(#users),
        ),
      ) as _i10.UsersService);
  @override
  _i10.ChecksService get checks => (super.noSuchMethod(
        Invocation.getter(#checks),
        returnValue: _FakeChecksService_94(
          this,
          Invocation.getter(#checks),
        ),
      ) as _i10.ChecksService);
  @override
  _i17.Future<T> getJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, String>? params,
    _i10.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: _i17.Future<T>.value(null),
      ) as _i17.Future<T>);
  @override
  _i17.Future<T> postJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i10.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: _i39.postJsonShim<S, T>(
          path,
          statusCode: statusCode,
          fail: fail,
          headers: headers,
          params: params,
          convert: convert,
          body: body,
          preview: preview,
        ),
      ) as _i17.Future<T>);
  @override
  _i17.Future<T> putJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i10.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: _i17.Future<T>.value(null),
      ) as _i17.Future<T>);
  @override
  _i17.Future<T> patchJSON<S, T>(
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i10.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: _i17.Future<T>.value(null),
      ) as _i17.Future<T>);
  @override
  _i17.Future<T> requestJson<S, T>(
    String? method,
    String? path, {
    int? statusCode,
    void Function(_i2.Response)? fail,
    Map<String, String>? headers,
    Map<String, dynamic>? params,
    _i10.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: _i17.Future<T>.value(null),
      ) as _i17.Future<T>);
  @override
  _i17.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: _i17.Future<_i2.Response>.value(_FakeResponse_95(
          this,
          Invocation.method(
            #request,
            [
              method,
              path,
            ],
            {
              #headers: headers,
              #params: params,
              #body: body,
              #statusCode: statusCode,
              #fail: fail,
              #preview: preview,
            },
          ),
        )),
      ) as _i17.Future<_i2.Response>);
  @override
  void handleStatusCode(_i2.Response? response) => super.noSuchMethod(
        Invocation.method(
          #handleStatusCode,
          [response],
        ),
        returnValueForMissingStub: null,
      );
  @override
  void dispose() => super.noSuchMethod(
        Invocation.method(
          #dispose,
          [],
        ),
        returnValueForMissingStub: null,
      );
}
