Skip to content
代码片段 群组 项目
提交 b365f76d 编辑于 作者: Raymond Liao's avatar Raymond Liao :nerd: 提交者: Neil Wang
浏览文件

feat: #630 用户在 app 中打开复制的 MR URL

上级 348db78f
No related branches found
No related tags found
无相关合并请求
......@@ -8,19 +8,20 @@ import 'package:jihu_gitlab_app/core/user_provider.dart';
import 'package:jihu_gitlab_app/core/widgets/toast.dart';
import 'package:jihu_gitlab_app/l10n/jihu_localizations.dart';
import 'package:jihu_gitlab_app/modules/issues/details/issue_details_page.dart';
import 'package:jihu_gitlab_app/modules/mr/merge_request_page.dart';
import 'package:provider/provider.dart';
class PasteTypeIssueNavigation extends StatefulWidget {
class PasteTypeUrlNavigation extends StatefulWidget {
final Widget child;
const PasteTypeIssueNavigation({super.key, required this.child});
const PasteTypeUrlNavigation({super.key, required this.child});
@override
State<PasteTypeIssueNavigation> createState() => _PasteTypeIssueNavigationState();
State<PasteTypeUrlNavigation> createState() => _PasteTypeUrlNavigationState();
}
class _PasteTypeIssueNavigationState extends State<PasteTypeIssueNavigation> {
final PasteTypeIssueNavigationModel _model = PasteTypeIssueNavigationModel();
class _PasteTypeUrlNavigationState extends State<PasteTypeUrlNavigation> {
final PasteTypeUrlNavigationModel _model = PasteTypeUrlNavigationModel();
@override
Widget build(BuildContext context) {
......@@ -39,35 +40,82 @@ class _PasteTypeIssueNavigationState extends State<PasteTypeIssueNavigation> {
}
}
class PasteTypeIssueNavigationModel {
class PasteTypeUrlNavigationModel {
void parseAndToward(String value, BuildContext context) {
try {
var url = value.urls[0];
var host = SettingsProvider().baseUrl.get;
var urlWithoutHost = url.replaceFirst('$host/', '');
var projectFullPath = urlWithoutHost.split('/-/issues/')[0];
var projectFullPath = urlWithoutHost.split('/-/')[0];
RegExp reg = RegExp('\\d+');
var issueIid = int.parse(reg.firstMatch(urlWithoutHost.split('/-/issues')[1])?[0] ?? '0');
HttpClient.instance().post('/api/graphql', {
"query": "query getIssue(\$fullPath: ID!, \$iid: String!) {\n project(fullPath: \$fullPath) {\n id\n nameWithNamespace\n issue(iid: \$iid) {\n id\n iid\n }\n }\n}\n",
"variables": {"fullPath": projectFullPath, "iid": "$issueIid"},
"operationName": "getIssue"
}).then((res) {
final params = <String, dynamic>{
'projectId': Id.fromGid(res.body()['data']['project']['id']).id,
'issueId': Id.fromGid(res.body()['data']['project']['issue']['id']).id,
'issueIid': int.parse(res.body()['data']['project']['issue']['iid']),
'targetId': Id.fromGid(res.body()['data']['project']['issue']['id']).id,
'targetIid': int.parse(res.body()['data']['project']['issue']['iid']),
'pathWithNamespace': res.body()['data']['project']['nameWithNamespace'],
'targetUrl': url,
'showLeading': true
};
Navigator.pushNamed(context, IssueDetailsPage.routeName, arguments: params);
});
if (urlWithoutHost.contains('/-/issues')) {
_parseIssue(reg, urlWithoutHost, projectFullPath, url, context);
return;
}
if (urlWithoutHost.contains('/-/merge_requests')) {
_parseMergeRequest(reg, urlWithoutHost, projectFullPath, url, context);
return;
}
} catch (e) {
debugPrint('Url parse error: $e');
Toast.error(context, JiHuLocalizations.dictionary().unrecognized_url);
}
return;
}
void _parseIssue(RegExp reg, String urlWithoutHost, String projectFullPath, String url, BuildContext context) {
var issueIid = int.parse(reg.firstMatch(urlWithoutHost.split('/-/issues')[1])?[0] ?? '0');
HttpClient.instance().post('/api/graphql', {
"variables": {"fullPath": projectFullPath, "iid": "$issueIid"},
"query": """
query (\$fullPath: ID!, \$iid: String!) {
project(fullPath: \$fullPath) {
id
nameWithNamespace
issue(iid: \$iid) {
id
iid
}
}
}
""",
}).then((res) {
final params = <String, dynamic>{
'projectId': Id.fromGid(res.body()['data']['project']['id']).id,
'issueId': Id.fromGid(res.body()['data']['project']['issue']['id']).id,
'issueIid': int.parse(res.body()['data']['project']['issue']['iid']),
'targetId': Id.fromGid(res.body()['data']['project']['issue']['id']).id,
'targetIid': int.parse(res.body()['data']['project']['issue']['iid']),
'pathWithNamespace': res.body()['data']['project']['nameWithNamespace'],
'targetUrl': url,
'showLeading': true
};
Navigator.pushNamed(context, IssueDetailsPage.routeName, arguments: params);
});
}
void _parseMergeRequest(RegExp reg, String urlWithoutHost, String projectFullPath, String url, BuildContext context) {
var mrIid = int.parse(reg.firstMatch(urlWithoutHost.split('/-/merge_requests')[1])?[0] ?? '0');
HttpClient.instance().post('/api/graphql', {
"variables": {"fullPath": projectFullPath},
"query": """
query (\$fullPath: ID!) {
project(fullPath: \$fullPath) {
id
name
fullPath
}
}
""",
}).then((res) {
final params = <String, dynamic>{
'projectId': Id.fromGid(res.body()['data']['project']['id']).id,
'projectName': res.body()['data']['project']['name'],
'mergeRequestIid': mrIid,
'fullPath': projectFullPath,
};
Navigator.pushNamed(context, MergeRequestPage.routeName, arguments: params);
});
}
}
......@@ -7,7 +7,7 @@ import 'package:jihu_gitlab_app/core/uri_launcher.dart';
import 'package:jihu_gitlab_app/core/user_provider.dart';
import 'package:jihu_gitlab_app/core/widgets/alerter.dart';
import 'package:jihu_gitlab_app/core/widgets/avatar/avatar.dart';
import 'package:jihu_gitlab_app/core/widgets/paste_type_issue_navigation.dart';
import 'package:jihu_gitlab_app/core/widgets/paste_type_url_navigation.dart';
import 'package:jihu_gitlab_app/l10n/jihu_localizations.dart';
import 'package:jihu_gitlab_app/modules/home/language_settings_page.dart';
import 'package:jihu_gitlab_app/modules/home/post_sales_service_page.dart';
......@@ -80,7 +80,7 @@ class _UserInfoViewState extends State<UserInfoView> {
)),
Column(
children: [
_buildPasteAndGo(context, SvgPicture.asset("assets/images/paste-and-go.svg", semanticsLabel: 'paste-and-go', width: 18, height: 18), JiHuLocalizations.dictionary().paste_and_go),
_buildPasteAndGoButton(context, SvgPicture.asset("assets/images/paste-and-go.svg", semanticsLabel: 'paste-and-go', width: 18, height: 18), JiHuLocalizations.dictionary().paste_and_go),
if (UserProvider.authorized) const Divider(thickness: 1, indent: 16, endIndent: 16, color: Color(0xFFEAEAEA)),
ListTile(
title: Text(JiHuLocalizations.dictionary().help, style: textTheme.titleLarge),
......@@ -171,8 +171,8 @@ class _UserInfoViewState extends State<UserInfoView> {
return "English";
}
Widget _buildPasteAndGo(BuildContext context, Widget leading, String title) {
return PasteTypeIssueNavigation(
Widget _buildPasteAndGoButton(BuildContext context, Widget leading, String title) {
return PasteTypeUrlNavigation(
child: ListTile(
enableFeedback: false,
leading: Column(
......
......@@ -4,7 +4,7 @@ import 'package:jihu_gitlab_app/core/global_keys.dart';
import 'package:jihu_gitlab_app/core/user_provider.dart';
import 'package:jihu_gitlab_app/core/widgets/avatar/avatar.dart';
import 'package:jihu_gitlab_app/core/widgets/common_app_bar.dart';
import 'package:jihu_gitlab_app/core/widgets/paste_type_issue_navigation.dart';
import 'package:jihu_gitlab_app/core/widgets/paste_type_url_navigation.dart';
import 'package:jihu_gitlab_app/core/widgets/user/user_info_view.dart';
import 'package:jihu_gitlab_app/l10n/jihu_localizations.dart';
import 'package:jihu_gitlab_app/modules/root/starred_tab.dart';
......@@ -72,7 +72,7 @@ class _DesktopRootPageState extends State<DesktopRootPage> {
onTap: _toggleSidebar,
child: Container(padding: const EdgeInsets.symmetric(horizontal: 16), height: _kAppbarHeight, child: SvgPicture.asset("assets/images/toggle_sidebar.svg", width: 28, height: 28))),
if (_orientation == Orientation.landscape && _sidebarCurrentWidth == _sidebarMaxWidth) Expanded(child: Text(JiHuLocalizations.dictionary().ji_hu_app_name)),
if (_orientation == Orientation.landscape && _sidebarCurrentWidth == _sidebarMaxWidth && UserProvider.authorized) pasteAndGo()
if (_orientation == Orientation.landscape && _sidebarCurrentWidth == _sidebarMaxWidth && UserProvider.authorized) _pasteAndGoButton()
],
),
),
......@@ -81,8 +81,8 @@ class _DesktopRootPageState extends State<DesktopRootPage> {
);
}
PasteTypeIssueNavigation pasteAndGo() {
return PasteTypeIssueNavigation(
PasteTypeUrlNavigation _pasteAndGoButton() {
return PasteTypeUrlNavigation(
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 16),
child: SvgPicture.asset('assets/images/paste-and-go.svg', width: 20, height: 20, color: const Color(0xFF66696D)),
......@@ -134,7 +134,7 @@ class _DesktopRootPageState extends State<DesktopRootPage> {
child: Column(
children: [
if (_orientation == Orientation.portrait)
Row(children: [Expanded(child: ListTile(title: Text(JiHuLocalizations.dictionary().ji_hu_app_name, style: const TextStyle(fontSize: 20)))), pasteAndGo()]),
Row(children: [Expanded(child: ListTile(title: Text(JiHuLocalizations.dictionary().ji_hu_app_name, style: const TextStyle(fontSize: 20)))), _pasteAndGoButton()]),
const Divider(),
...widget.destinations.map((item) => ListTile(
visualDensity: const VisualDensity(horizontal: -2, vertical: -2),
......
......@@ -55,7 +55,6 @@ class MockPhotoPicker extends _i1.Mock implements _i2.PhotoPicker {
returnValue: _i4.Future<bool>.value(false),
returnValueForMissingStub: _i4.Future<bool>.value(false),
) as _i4.Future<bool>);
@override
_i4.Future<void> requireAccess(_i5.BuildContext? context) => (super.noSuchMethod(
Invocation.method(
......@@ -65,7 +64,6 @@ class MockPhotoPicker extends _i1.Mock implements _i2.PhotoPicker {
returnValue: _i4.Future<void>.value(),
returnValueForMissingStub: _i4.Future<void>.value(),
) as _i4.Future<void>);
@override
_i4.Future<_i2.PhotoPickerResult> pickImage() => (super.noSuchMethod(
Invocation.method(
......@@ -87,7 +85,6 @@ class MockPhotoPicker extends _i1.Mock implements _i2.PhotoPicker {
),
)),
) as _i4.Future<_i2.PhotoPickerResult>);
@override
_i4.Future<_i2.PhotoPickerResult> pickVideo() => (super.noSuchMethod(
Invocation.method(
......@@ -109,7 +106,6 @@ class MockPhotoPicker extends _i1.Mock implements _i2.PhotoPicker {
),
)),
) as _i4.Future<_i2.PhotoPickerResult>);
@override
_i4.Future<_i2.PhotoPickerResult> retrieveLostData() => (super.noSuchMethod(
Invocation.method(
......@@ -174,7 +170,6 @@ class MockFileUploader extends _i1.Mock implements _i3.FileUploader {
),
)),
) as _i4.Future<_i3.FileUploadResult>);
@override
void injectInstanceForTesting(_i3.FileUploader? mock) => super.noSuchMethod(
Invocation.method(
......
......@@ -3,24 +3,24 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jihu_gitlab_app/core/clipboard.dart';
import 'package:jihu_gitlab_app/core/dependency_injector.dart';
import 'package:jihu_gitlab_app/core/local_storage.dart';
import 'package:jihu_gitlab_app/core/net/http_client.dart';
import 'package:jihu_gitlab_app/core/net/response.dart';
import 'package:jihu_gitlab_app/core/settings/settings_provider.dart';
import 'package:jihu_gitlab_app/core/user_provider.dart';
import 'package:jihu_gitlab_app/core/widgets/paste_type_issue_navigation.dart';
import 'package:jihu_gitlab_app/l10n/jihu_localizations.dart';
import 'package:jihu_gitlab_app/core/widgets/paste_type_url_navigation.dart';
import 'package:jihu_gitlab_app/modules/issues/details/issue_details_page.dart';
import 'package:jihu_gitlab_app/modules/issues/details/models/issue_details_model.dart';
import 'package:jihu_gitlab_app/modules/mr/merge_request_page.dart';
import 'package:jihu_gitlab_app/modules/mr/models/graphql_request_body.dart';
import 'package:jihu_gitlab_app/modules/root/model/root_store.dart';
import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../mocker/tester.dart';
import '../../test_data/merge_request.dart';
import '../net/http_request_test.mocks.dart';
import 'paste_type_issue_navigation_test.mocks.dart';
import 'paste_type_url_navigation_test.mocks.dart';
@GenerateMocks([Clipboard])
void main() {
......@@ -28,18 +28,18 @@ void main() {
final clipboard = MockClipboard();
setUp(() async {
JiHuLocalizations.init();
SharedPreferences.setMockInitialValues(<String, Object>{});
await LocalStorage.init();
LocalStorage.save('privacy-policy-agreed', true);
WidgetsFlutterBinding.ensureInitialized();
Clipboard.injectForTest(clipboard);
HttpClient.setInstance(client);
UserProvider().resetToken(Tester.token());
UserProvider().reset(Tester.user());
});
testWidgets('Should not navigate to expect page when url parse error', (tester) async {
when(clipboard.fromClipboard()).thenAnswer((_) => Future(() => ''));
Clipboard.injectForTest(clipboard);
HttpClient.setInstance(client);
await tester.pumpWidget(
MultiProvider(
providers: [
......@@ -48,7 +48,7 @@ void main() {
],
child: MaterialApp(
home: Scaffold(
body: PasteTypeIssueNavigation(
body: PasteTypeUrlNavigation(
child: SvgPicture.asset(
'assets/images/paste-and-go.svg',
width: 20,
......@@ -65,10 +65,9 @@ void main() {
await tester.pump(const Duration(seconds: 1));
}
expect(find.byType(SvgPicture), findsOneWidget);
UserProvider().fullReset();
});
testWidgets('Should navigate to expect page', (tester) async {
testWidgets('Should navigate to expect issue details page', (tester) async {
var params = {'projectId': 72936, 'issueId': 3242, 'issueIid': 0, 'targetId': 45345, 'targetIid': 6, 'pathWithNamespace': 'ultimate-plan/jihu-gitlab-app/demo-mr-test'};
SettingsProvider().resetBaseUrl('https://jihulab.com');
when(clipboard.fromClipboard()).thenAnswer((_) => Future(() => 'https://jihulab.com/ultimate-plan/jihu-gitlab-app/jihu-gitlab-app/-/issues/531/'));
......@@ -86,8 +85,6 @@ void main() {
})));
var issueDetailsModel = IssueDetailsModel();
locator.registerSingleton(issueDetailsModel);
Clipboard.injectForTest(clipboard);
HttpClient.setInstance(client);
await tester.pumpWidget(
MultiProvider(
providers: [
......@@ -97,7 +94,7 @@ void main() {
child: MaterialApp(
routes: {IssueDetailsPage.routeName: (context) => IssueDetailsPage(arguments: params)},
home: Scaffold(
body: PasteTypeIssueNavigation(
body: PasteTypeUrlNavigation(
child: SvgPicture.asset(
'assets/images/paste-and-go.svg',
width: 20,
......@@ -114,6 +111,69 @@ void main() {
await tester.pump(const Duration(seconds: 1));
}
expect(find.byType(IssueDetailsPage), findsOneWidget);
locator.unregister<IssueDetailsModel>();
});
testWidgets('Should navigate to expect MR details page', (tester) async {
SettingsProvider().resetBaseUrl('https://jihulab.com');
when(clipboard.fromClipboard()).thenAnswer((_) => Future(() => 'https://jihulab.com/ultimate-plan/jihu-gitlab-app/jihu-gitlab-app/-/merge_requests/373'));
when(client.get<Map<String, dynamic>>("/api/v4/projects/59893/merge_requests/371/approvals")).thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(approvalResponse)));
when(client.get('/api/v4/projects/59893')).thenAnswer((_) => Future(() => Response.of<Map>({"path_with_namespace": "ultimate-plan/jihu-gitlab-app/jihu-gitlab-app"})));
when(client.post('/api/graphql', getMergeRequestDetailsGraphQLRequestBody('ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 371)))
.thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(mrRebaseGraphQLResponse)));
when(client.post('/api/graphql', {
"variables": {"fullPath": 'ultimate-plan/jihu-gitlab-app/jihu-gitlab-app'},
"query": """
query (\$fullPath: ID!) {
project(fullPath: \$fullPath) {
id
name
fullPath
}
}
""",
})).thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>({
"data": {
"project": {"id": "gid://gitlab/Project/59893", "name": "demo", "fullPath": "ultimate-plan/jihu-gitlab-app/jihu-gitlab-app"}
}
})));
var issueDetailsModel = IssueDetailsModel();
locator.registerSingleton(issueDetailsModel);
var parameters = {'projectId': 59893, 'projectName': "demo", 'mergeRequestIid': 371, 'fullPath': 'ultimate-plan/jihu-gitlab-app/jihu-gitlab-app'};
await tester.pumpWidget(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => RootStore()),
ChangeNotifierProvider(create: (context) => UserProvider()),
],
child: MaterialApp(
routes: {MergeRequestPage.routeName: (context) => MergeRequestPage(arguments: parameters)},
home: Scaffold(
body: PasteTypeUrlNavigation(
child: SvgPicture.asset(
'assets/images/paste-and-go.svg',
width: 20,
height: 20,
)),
),
),
),
);
await tester.pumpAndSettle();
expect(find.byType(SvgPicture), findsOneWidget);
await tester.tap(find.byType(SvgPicture));
for (int i = 0; i < 5; i++) {
await tester.pump(const Duration(seconds: 1));
}
expect(find.byType(MergeRequestPage), findsOneWidget);
expect(find.text('demo #371'), findsOneWidget);
expect(find.text('Draft: Resolve "Feature: 开发人员 Rebase MR"'), findsOneWidget);
});
tearDown(() {
UserProvider().fullReset();
});
}
// Mocks generated by Mockito 5.3.2 from annotations
// in jihu_gitlab_app/test/core/widgets/paste_type_issue_navigation_test.dart.
// in jihu_gitlab_app/test/core/widgets/paste_type_url_navigation_test.dart.
// Do not manually edit this file.
// ignore_for_file: no_leading_underscores_for_library_prefixes
......
......@@ -20,8 +20,8 @@ import 'package:sqflite_common/sqlite_api.dart' as _i2;
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class
class _FakeDatabase_0 extends _i1.SmartFake implements _i2.Database {
_FakeDatabase_0(
class _FakeQueryCursor_0 extends _i1.SmartFake implements _i2.QueryCursor {
_FakeQueryCursor_0(
Object parent,
Invocation parentInvocation,
) : super(
......@@ -30,18 +30,8 @@ class _FakeDatabase_0 extends _i1.SmartFake implements _i2.Database {
);
}
class _FakeQueryCursor_1 extends _i1.SmartFake implements _i2.QueryCursor {
_FakeQueryCursor_1(
Object parent,
Invocation parentInvocation,
) : super(
parent,
parentInvocation,
);
}
class _FakeBatch_2 extends _i1.SmartFake implements _i2.Batch {
_FakeBatch_2(
class _FakeBatch_1 extends _i1.SmartFake implements _i2.Batch {
_FakeBatch_1(
Object parent,
Invocation parentInvocation,
) : super(
......@@ -60,27 +50,12 @@ class MockDatabase extends _i1.Mock implements _i2.Database {
returnValue: '',
returnValueForMissingStub: '',
) as String);
@override
bool get isOpen => (super.noSuchMethod(
Invocation.getter(#isOpen),
returnValue: false,
returnValueForMissingStub: false,
) as bool);
@override
_i2.Database get database => (super.noSuchMethod(
Invocation.getter(#database),
returnValue: _FakeDatabase_0(
this,
Invocation.getter(#database),
),
returnValueForMissingStub: _FakeDatabase_0(
this,
Invocation.getter(#database),
),
) as _i2.Database);
@override
_i3.Future<void> close() => (super.noSuchMethod(
Invocation.method(
......@@ -90,7 +65,6 @@ class MockDatabase extends _i1.Mock implements _i2.Database {
returnValue: _i3.Future<void>.value(),
returnValueForMissingStub: _i3.Future<void>.value(),
) as _i3.Future<void>);
@override
_i3.Future<T> transaction<T>(
_i3.Future<T> Function(_i2.Transaction)? action, {
......@@ -105,10 +79,31 @@ class MockDatabase extends _i1.Mock implements _i2.Database {
returnValue: _i3.Future<T>.value(null),
returnValueForMissingStub: _i3.Future<T>.value(null),
) as _i3.Future<T>);
@override
_i3.Future<int> getVersion() => (super.noSuchMethod(
Invocation.method(
#getVersion,
[],
),
returnValue: _i3.Future<int>.value(0),
returnValueForMissingStub: _i3.Future<int>.value(0),
) as _i3.Future<int>);
@override
_i3.Future<void> setVersion(int? version) => (super.noSuchMethod(
Invocation.method(
#setVersion,
[version],
),
returnValue: _i3.Future<void>.value(),
returnValueForMissingStub: _i3.Future<void>.value(),
) as _i3.Future<void>);
@override
_i3.Future<T> devInvokeMethod<T>(
String? method, [
Object? arguments,
dynamic arguments,
]) =>
(super.noSuchMethod(
Invocation.method(
......@@ -256,7 +251,7 @@ class MockDatabase extends _i1.Mock implements _i2.Database {
],
{#bufferSize: bufferSize},
),
returnValue: _i3.Future<_i2.QueryCursor>.value(_FakeQueryCursor_1(
returnValue: _i3.Future<_i2.QueryCursor>.value(_FakeQueryCursor_0(
this,
Invocation.method(
#rawQueryCursor,
......@@ -267,7 +262,7 @@ class MockDatabase extends _i1.Mock implements _i2.Database {
{#bufferSize: bufferSize},
),
)),
returnValueForMissingStub: _i3.Future<_i2.QueryCursor>.value(_FakeQueryCursor_1(
returnValueForMissingStub: _i3.Future<_i2.QueryCursor>.value(_FakeQueryCursor_0(
this,
Invocation.method(
#rawQueryCursor,
......@@ -310,7 +305,7 @@ class MockDatabase extends _i1.Mock implements _i2.Database {
#bufferSize: bufferSize,
},
),
returnValue: _i3.Future<_i2.QueryCursor>.value(_FakeQueryCursor_1(
returnValue: _i3.Future<_i2.QueryCursor>.value(_FakeQueryCursor_0(
this,
Invocation.method(
#queryCursor,
......@@ -329,7 +324,7 @@ class MockDatabase extends _i1.Mock implements _i2.Database {
},
),
)),
returnValueForMissingStub: _i3.Future<_i2.QueryCursor>.value(_FakeQueryCursor_1(
returnValueForMissingStub: _i3.Future<_i2.QueryCursor>.value(_FakeQueryCursor_0(
this,
Invocation.method(
#queryCursor,
......@@ -429,14 +424,14 @@ class MockDatabase extends _i1.Mock implements _i2.Database {
#batch,
[],
),
returnValue: _FakeBatch_2(
returnValue: _FakeBatch_1(
this,
Invocation.method(
#batch,
[],
),
),
returnValueForMissingStub: _FakeBatch_2(
returnValueForMissingStub: _FakeBatch_1(
this,
Invocation.method(
#batch,
......
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册