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

feat: #761 AI 检测到重复的提交消息,建议压缩

上级 99838173
No related branches found
No related tags found
无相关合并请求
显示
567 个添加483 个删除
......@@ -278,5 +278,6 @@
"addAccount": "Add an account",
"unsupportedFileType": "Unable to open this file",
"openInBrowser": "Open in browser",
"loginFirst": "Please login to get access for this operation."
"loginFirst": "Please login to get access for this operation.",
"aiSquashRecommends": "AI detects duplicate commit messages, recommends squashing."
}
......@@ -278,5 +278,6 @@
"addAccount": "添加账号",
"unsupportedFileType": "暂不支持打开此类型文件",
"openInBrowser": "在浏览器中打开",
"loginFirst": "请登录以完成此操作。"
"loginFirst": "请登录以完成此操作。",
"aiSquashRecommends": "AI 检测到重复的提交消息,建议压缩。"
}
......@@ -24,19 +24,19 @@ class ChangesViewState extends State<ChangesView> {
@override
Widget build(BuildContext context) {
return (_model.diffs?.isEmpty ?? true)
return (_model.diffs.isEmpty)
? Center(child: Text(JiHuLocalizations.dictionary().noChanges, style: Theme.of(context).textTheme.bodySmall))
: ListView.separated(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: _model.diffs!.length,
itemCount: _model.diffs.length,
itemBuilder: (context, index) {
var diff = _model.diffs![index];
var diff = _model.diffs[index];
return ListTile(
enableFeedback: false,
dense: true,
onTap: () {
Navigator.of(context).push(MaterialPageRoute(builder: (context) => MrChangesPage(diffs: _model.diffs!, targetIndex: index), fullscreenDialog: true));
Navigator.of(context).push(MaterialPageRoute(builder: (context) => MrChangesPage(diffs: _model.diffs, targetIndex: index), fullscreenDialog: true));
},
title: Text(diff.newPath, style: const TextStyle(fontSize: 12, color: Colors.black87, fontWeight: FontWeight.w400)),
trailing: const Icon(Icons.keyboard_arrow_right, size: 20),
......
import 'dart:async';
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/cupertino.dart';
import 'package:jihu_gitlab_app/core/net/api.dart';
import 'package:jihu_gitlab_app/core/net/project_request_sender.dart';
import 'package:jihu_gitlab_app/modules/mr/models/commits.dart';
class CommitsModel {
late ValueNotifier<List<Commit>> _notifier;
final List<Commit> _data = [];
bool _hasNextPage = false;
String _endCursor = '';
late String _fullPath;
late int _mrIid;
final EasyRefreshController _easyRefreshController = EasyRefreshController(controlFinishRefresh: false, controlFinishLoad: true);
void init(String fullPath, int mrIid) {
_fullPath = fullPath;
_mrIid = mrIid;
_notifier = ValueNotifier(_data);
refresh();
}
ValueNotifier<List<Commit>> get notifier => _notifier;
Future<void> refresh() async {
_endCursor = '';
_data.clear();
_data.addAll(await _getCommits());
_notifier.value = List.of(_data);
}
Future<void> loadMore() async {
_data.addAll(await _getCommits());
_notifier.value = List.of(_data);
_easyRefreshController.finishLoad(_hasNextPage ? IndicatorResult.success : IndicatorResult.noMore);
}
Future<List<Commit>> _getCommits() async {
var response = await ProjectRequestSender.instance().post(Api.graphql(), {
"query": """
query getCommits{
project(fullPath: "$_fullPath") {
mergeRequest(iid: "$_mrIid") {
commits(after: "$_endCursor"){
pageInfo{
hasNextPage
endCursor
}
nodes{
title
authoredDate
author{
name
avatarUrl
}
}
}
}
}
}
"""
});
var data = response.body()["data"]?['project']?['mergeRequest']?['commits'];
_hasNextPage = data?['pageInfo']?['hasNextPage'] ?? false;
_endCursor = data?['pageInfo']?['endCursor'] ?? '';
List<Commit> commits = ((data?['nodes'] ?? []) as List).map((e) => Commit.fromJson(e)).toList();
return Future.value(commits);
}
EasyRefreshController get easyRefreshController => _easyRefreshController;
}
import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:jihu_gitlab_app/core/domain/avatar_url.dart';
import 'package:jihu_gitlab_app/core/project_provider.dart';
......@@ -6,48 +5,32 @@ import 'package:jihu_gitlab_app/core/widgets/avatar/avatar.dart';
import 'package:jihu_gitlab_app/core/widgets/changeable_time.dart';
import 'package:jihu_gitlab_app/core/widgets/tips_view.dart';
import 'package:jihu_gitlab_app/l10n/jihu_localizations.dart';
import 'package:jihu_gitlab_app/modules/mr/commits/commits_model.dart';
import 'package:jihu_gitlab_app/modules/mr/models/commits.dart';
class CommitsView extends StatefulWidget {
final String fullPath;
final int mrIid;
final List<Commit> commits;
const CommitsView({required this.fullPath, required this.mrIid, Key? key}) : super(key: key);
const CommitsView({Key? key, required this.commits}) : super(key: key);
@override
State<CommitsView> createState() => _CommitsViewState();
}
class _CommitsViewState extends State<CommitsView> with AutomaticKeepAliveClientMixin {
final CommitsModel _model = CommitsModel();
@override
void initState() {
_model.init(widget.fullPath, widget.mrIid);
super.initState();
}
@override
Widget build(BuildContext context) {
super.build(context);
List<Commit> commits = widget.commits;
if (commits.isEmpty) {
return TipsView(icon: "assets/images/no_commits.svg", message: JiHuLocalizations.dictionary().noCommits);
}
return Padding(
padding: const EdgeInsets.only(top: 10),
child: EasyRefresh(
controller: _model.easyRefreshController,
onLoad: _model.loadMore,
child: ValueListenableBuilder<List<Commit>>(
valueListenable: _model.notifier,
builder: (context, data, child) {
if (data.isEmpty) {
return TipsView(icon: "assets/images/no_commits.svg", message: JiHuLocalizations.dictionary().noCommits, onRefresh: _model.refresh);
}
return ListView.separated(
itemBuilder: (context, index) => _buildItem(data[index]),
itemCount: data.length,
separatorBuilder: (BuildContext context, int index) => const Divider(color: Color(0xFFEAEAEA), thickness: 1, indent: 48, endIndent: 16, height: 20),
);
})),
child: ListView.separated(
itemBuilder: (context, index) => _buildItem(commits[index]),
itemCount: commits.length,
separatorBuilder: (BuildContext context, int index) => const Divider(color: Color(0xFFEAEAEA), thickness: 1, indent: 48, endIndent: 16, height: 20),
),
);
}
......
......@@ -21,6 +21,12 @@ class _MergeOptionViewState extends State<MergeOptionView> {
super.initState();
}
@override
void didUpdateWidget(covariant MergeOptionView oldWidget) {
_checked = widget.checked;
super.didUpdateWidget(oldWidget);
}
@override
Widget build(BuildContext context) {
return Row(
......
......@@ -15,7 +15,7 @@ class MergeReadyView extends StatefulWidget {
final MergeRequest mergeRequest;
final VoidFutureCallBack onMergeFinished;
const MergeReadyView({required this.mergeRequest, required this.onMergeFinished, Key? key}) : super(key: key);
const MergeReadyView({Key? key, required this.mergeRequest, required this.onMergeFinished}) : super(key: key);
@override
State<MergeReadyView> createState() => _MergeReadyViewState();
......@@ -29,15 +29,32 @@ class _MergeReadyViewState extends State<MergeReadyView> {
final TextEditingController _mergeCommitMessageInputController = TextEditingController();
final TextEditingController _squashCommitMessageInputController = TextEditingController();
bool _isLoopingMergeResult = false;
String? _aiRecommendsSquashCommitMessage;
@override
void initState() {
_initDataFromParent();
super.initState();
}
@override
void didUpdateWidget(covariant MergeReadyView oldWidget) {
_initDataFromParent();
super.didUpdateWidget(oldWidget);
}
void _initDataFromParent() {
_squashCommitsChecked = _mr.squashOnMerge;
if (!_mr.squashReadOnly) {
_squashCommitsChecked = _mr.commitsHasDuplicates;
if (_mr.commitsHasDuplicates) {
_aiRecommendsSquashCommitMessage = JiHuLocalizations.dictionary().aiSquashRecommends;
}
}
_deleteSourceBranch = _mr.forceRemoveSourceBranch;
_mergeCommitMessageInputController.text = widget.mergeRequest.defaultMergeCommitMessage;
_squashCommitMessageInputController.text = widget.mergeRequest.defaultSquashCommitMessage;
_isLoopingMergeResult = widget.mergeRequest.mergeOngoing;
super.initState();
}
@override
......@@ -89,9 +106,11 @@ class _MergeReadyViewState extends State<MergeReadyView> {
description: JiHuLocalizations.dictionary().squashCommits,
checked: _squashCommitsChecked,
disabled: _interactionDisabled || _mr.squashReadOnly,
onCheckChanged: (value) => setState(() {
setState(() => _squashCommitsChecked = value);
})),
onCheckChanged: (value) => setState(() => _squashCommitsChecked = value)),
if (_aiRecommendsSquashCommitMessage != null)
Padding(
padding: const EdgeInsets.only(left: 14),
child: Text(_aiRecommendsSquashCommitMessage!, style: const TextStyle(color: Color(0xFF66696D), fontSize: 13, fontWeight: FontWeight.w400))),
if (_editCommitMessageOptionVisible)
MergeOptionView(
description: JiHuLocalizations.dictionary().editCommitMessage,
......@@ -103,9 +122,8 @@ class _MergeReadyViewState extends State<MergeReadyView> {
if (_squashCommitMessageInputVisible) _buildMessageInput(_squashCommitMessageInputController, JiHuLocalizations.dictionary().squashCommitMessage),
if (_squashCommitMessageInputVisible && _mergeCommitMessageInputVisible) const SizedBox(height: 8),
if (_mergeCommitMessageInputVisible) _buildMessageInput(_mergeCommitMessageInputController, JiHuLocalizations.dictionary().mergeCommitMessage),
if (hint != null) const SizedBox(height: 8),
if (hint != null)
Padding(padding: const EdgeInsets.only(left: 14), child: Text(hint!, style: const TextStyle(color: Color(0xFF66696D), fontSize: 13, fontWeight: FontWeight.w400)))
Padding(padding: const EdgeInsets.only(top: 8, left: 14), child: Text(hint!, style: const TextStyle(color: Color(0xFF66696D), fontSize: 13, fontWeight: FontWeight.w400)))
],
),
)
......
......@@ -152,7 +152,7 @@ class _MergeRequestPageState extends State<MergeRequestPage> with TickerProvider
Widget _buildCommitsBody() {
if (_model.mr == null) return const SizedBox();
return CommitsView(fullPath: _model.projectFullPath, mrIid: _model.mr!.iid);
return CommitsView(commits: _model.mr?.commits.items ?? []);
}
Widget _buildDescription() {
......
import 'package:jihu_gitlab_app/core/time.dart';
import 'package:jihu_gitlab_app/core/connection_provider/connection.dart';
import 'package:jihu_gitlab_app/core/time.dart';
class Commits {
final List<Commit> _commits;
final List<Commit> _items;
Commits._(this._commits);
Commits._(this._items);
factory Commits.fromJson(body) {
return Commits._((body as List<dynamic>).map((o) => Commit.fromJson(o)).toList());
}
get latestShortId => _commits.isEmpty ? ' ' : _commits.first.shortId;
factory Commits.fromList(List<Commit> list) {
return Commits._(list);
}
get latestShortId => _items.isEmpty ? ' ' : _items.first.shortId;
get isNotEmpty => _items.isNotEmpty;
get isNotEmpty => _commits.isNotEmpty;
List<Commit> get items => _items;
}
class Commit {
......
import 'package:flutter_svg/flutter_svg.dart';
import 'package:jihu_gitlab_app/core/connection_provider/connection.dart';
import 'package:jihu_gitlab_app/core/domain/assignee/assignee.dart';
import 'package:jihu_gitlab_app/core/id.dart';
import 'package:jihu_gitlab_app/core/time.dart';
import 'package:jihu_gitlab_app/core/connection_provider/connection.dart';
import 'package:jihu_gitlab_app/l10n/jihu_localizations.dart';
import 'package:jihu_gitlab_app/modules/mr/models/code_quality_report.dart';
import 'package:jihu_gitlab_app/modules/mr/models/commits.dart';
......@@ -30,7 +30,7 @@ class MergeRequest {
final bool hasConflicts;
final int commitCount;
final bool draft;
final Commits commits;
Commits _commits;
CodeQualityReport? _codeQualityReport;
final Jobs jobs;
List<ApprovalRule> _approvalRules;
......@@ -49,6 +49,7 @@ class MergeRequest {
final bool mergeOngoing;
List<String> availableAutoMergeStrategies;
bool mergeWhenPipelineSucceeds;
bool commitsHasDuplicates = false;
MergeRequest._(
this.iid,
......@@ -69,7 +70,7 @@ class MergeRequest {
this.hasConflicts,
this.commitCount,
this.draft,
this.commits,
this._commits,
this._codeQualityReport,
this.jobs,
this._approvalRules,
......@@ -142,11 +143,22 @@ class MergeRequest {
_approvalRules = rules.map((e) => ApprovalRule.fromGraphQLJson(e)).toList();
}
void updateCommits(List<Commit> items) {
_commits = Commits.fromList(items);
List titles = [];
for (var u in items) {
if (!titles.contains(u.title)) titles.add(u.title);
}
commitsHasDuplicates = items.length != titles.length;
}
List<ApprovalRule> get approvalRules => _approvalRules;
CodeQualityReport? get codeQualityReport => _codeQualityReport;
DetailMergeStatus get detailedMergeStatus => _detailedMergeStatus;
Commits get commits => _commits;
}
enum MergeRequestState {
......
......@@ -9,8 +9,9 @@ import 'package:jihu_gitlab_app/modules/mr/models/merge_request.dart';
import '../changes_view.dart';
import 'approval.dart';
import 'commits.dart';
import 'diff.dart';
import 'graphql_request_body.dart';
import 'mr_graphql_request_body.dart';
class MergeRequestModel {
static GlobalKey<ChangesViewState> pageKey = GlobalKey();
......@@ -21,13 +22,14 @@ class MergeRequestModel {
late String projectName;
late String projectFullPath;
late int mergeRequestIid;
late TabController _tabController;
late TickerProvider _tickerProvider;
MergeRequest? mr;
SystemType systemType = SystemType.latest;
Approval? approval;
List<Diff>? diffs;
List<Diff> _diffs = [];
LoadState _loadState = LoadState.noItemState;
void init(Map<dynamic, dynamic> arguments, TickerProvider tickerProvider) {
......@@ -43,6 +45,7 @@ class MergeRequestModel {
_getApproval(setState);
await _getBasicMr(setState);
_getMrForPaid(setState);
refreshCommits(setState);
refreshDiffs(setState);
}
......@@ -53,7 +56,7 @@ class MergeRequestModel {
Future<void> refreshDiffs(void Function()? setState) async {
try {
diffs = await _getDiffs();
_diffs = await _getDiffs();
_tabLength = 3;
_tabController = TabController(initialIndex: 0, length: _tabLength, vsync: _tickerProvider);
setState?.call();
......@@ -82,6 +85,35 @@ class MergeRequestModel {
}
}
Future<void> refreshCommits(void Function()? setState) async {
try {
mr?.updateCommits(await _getCommits());
setState?.call();
} catch (e) {
LogHelper.err("Failed to getCommits of merge request: ", e);
}
}
Future<List<Commit>> _getCommits() async {
String endCursor = '';
bool hasNextPage = true;
List<Commit> allCommits = [];
try {
do {
var response = await ProjectRequestSender.instance().post(Api.graphql(), queryCommitsGraphQLRequestBody(projectFullPath, mergeRequestIid, endCursor));
var data = response.body()["data"]?['project']?['mergeRequest']?['commits'];
hasNextPage = data?['pageInfo']?['hasNextPage'] ?? false;
endCursor = data?['pageInfo']?['endCursor'] ?? '';
List<Commit> commits = ((data?['nodes'] ?? []) as List).map((e) => Commit.fromJson(e)).toList();
allCommits.addAll(commits);
} while (hasNextPage);
return allCommits;
} catch (e) {
LogHelper.err('_getCommits error', e);
return [];
}
}
Future<void> _getBasicMr(void Function()? setState) {
return _makeRefresh(() async {
var resp = await ProjectRequestSender.instance().post(Api.graphql(), getMergeRequestDetailsGraphQLRequestBody(projectFullPath, mergeRequestIid));
......@@ -166,4 +198,6 @@ class MergeRequestModel {
TabController get tabController => _tabController;
bool get mergedInfoVisible => mr != null && mr!.state == MergeRequestState.merged;
List<Diff> get diffs => _diffs;
}
......@@ -225,11 +225,10 @@ Map<String, dynamic> getPaidMergeRequestDetailsGraphQLRequestBody(String fullPat
Map<String, dynamic> queryRebaseInProgressGraphQLRequestBody(String fullPath, int mrIid) {
return {
"variables": {"fullPath": fullPath, "mrIid": '$mrIid'},
"query": """
query (\$fullPath: ID!, \$mrIid: String!){
project(fullPath: \$fullPath) {
mergeRequest(iid: \$mrIid) {
{
project(fullPath: "$fullPath") {
mergeRequest(iid: "$mrIid") {
rebaseInProgress
}
}
......@@ -237,3 +236,34 @@ Map<String, dynamic> queryRebaseInProgressGraphQLRequestBody(String fullPath, in
"""
};
}
Map<String, dynamic> queryCommitsGraphQLRequestBody(String fullPath, int mrIid, String endCursor) {
return {
"query": """
query getCommits{
project(fullPath: "$fullPath") {
mergeRequest(iid: "$mrIid") {
commits(after: "$endCursor"){
pageInfo{
hasNextPage
endCursor
}
nodes{
id
shortId
sha
title
description
authoredDate
author{
name
avatarUrl
}
}
}
}
}
}
"""
};
}
......@@ -12,7 +12,7 @@ import 'package:jihu_gitlab_app/modules/issues/details/issue_details_page.dart';
import 'package:jihu_gitlab_app/modules/issues/details/models/issue_details_gq_request_body.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/mr/models/mr_graphql_request_body.dart';
import 'package:jihu_gitlab_app/modules/root/model/root_store.dart';
import 'package:jihu_gitlab_app/routers.dart';
import 'package:mockito/annotations.dart';
......@@ -150,6 +150,7 @@ void main() {
.thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(mrRebaseGraphQLResponse)));
when(client.post('/api/graphql', getPaidMergeRequestDetailsGraphQLRequestBody('ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 371)))
.thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(paidMrRebaseGraphQLResponse)));
when(client.post("/api/graphql", queryCommitsGraphQLRequestBody("ultimate-plan/jihu-gitlab-app/jihu-gitlab-app", 371, ''))).thenAnswer((_) => Future(() => Response.of(commitsGraphQLResponse)));
when(client.get<List<Map<String, dynamic>>>("/api/v4/projects/59893/merge_requests/371/diffs?page=1&per_page=20")).thenAnswer((_) => Future(() => Response.of<List<Map<String, dynamic>>>([])));
when(client.post('/api/graphql', {
"variables": {"fullPath": 'ultimate-plan/jihu-gitlab-app/jihu-gitlab-app'},
......
......@@ -10,7 +10,7 @@ import 'package:jihu_gitlab_app/generated/l10n.dart';
import 'package:jihu_gitlab_app/l10n/current_locale.dart';
import 'package:jihu_gitlab_app/modules/mr/approval_rule_view.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/mr/models/mr_graphql_request_body.dart';
import 'package:jihu_gitlab_app/routers.dart';
import 'package:mockito/mockito.dart';
import 'package:provider/provider.dart';
......@@ -41,6 +41,7 @@ void main() {
.thenAnswer((_) => Future(() => r.Response.of<Map<String, dynamic>>(mrGraphQLResponse)));
when(client.post('/api/graphql', getPaidMergeRequestDetailsGraphQLRequestBody('ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 17)))
.thenAnswer((_) => Future(() => r.Response.of<Map<String, dynamic>>(paidMrGraphQLResponse)));
when(client.post("/api/graphql", queryCommitsGraphQLRequestBody("ultimate-plan/jihu-gitlab-app/jihu-gitlab-app", 17, ''))).thenAnswer((_) => Future(() => r.Response.of(commitsGraphQLResponse)));
when(client.get<List<Map<String, dynamic>>>("/api/v4/projects/72936/merge_requests/17/diffs?page=1&per_page=20")).thenAnswer((_) => Future(() => r.Response.of<List<Map<String, dynamic>>>([])));
var parameters = {'projectId': 72936, 'projectName': "demo", 'mergeRequestIid': 17, 'fullPath': 'ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 'test': true};
......
......@@ -10,7 +10,7 @@ import 'package:jihu_gitlab_app/generated/l10n.dart';
import 'package:jihu_gitlab_app/l10n/current_locale.dart';
import 'package:jihu_gitlab_app/modules/mr/approval_rule_view.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/mr/models/mr_graphql_request_body.dart';
import 'package:jihu_gitlab_app/routers.dart';
import 'package:mockito/mockito.dart';
import 'package:provider/provider.dart';
......@@ -40,6 +40,7 @@ void main() {
.thenAnswer((_) => Future(() => r.Response.of<Map<String, dynamic>>(mrGraphQLResponse)));
when(client.post('/api/graphql', getPaidMergeRequestDetailsGraphQLRequestBody('ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 18)))
.thenAnswer((_) => Future(() => r.Response.of<Map<String, dynamic>>(paidMrGraphQLResponse)));
when(client.post("/api/graphql", queryCommitsGraphQLRequestBody("ultimate-plan/jihu-gitlab-app/jihu-gitlab-app", 18, ''))).thenAnswer((_) => Future(() => r.Response.of(commitsGraphQLResponse)));
when(client.get<List<Map<String, dynamic>>>("/api/v4/projects/72936/merge_requests/18/diffs?page=1&per_page=20")).thenAnswer((_) => Future(() => r.Response.of<List<Map<String, dynamic>>>([])));
var parameters = {'projectId': 72936, 'projectName': "demo", 'mergeRequestIid': 18, 'fullPath': 'ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 'test': true};
......@@ -687,3 +688,33 @@ Map<String, dynamic> paidMrGraphQLResponse = {
}
}
};
Map<String, dynamic> commitsGraphQLResponse = {
"data": {
"project": {
"mergeRequest": {
"commits": {
"pageInfo": {"hasNextPage": false, "endCursor": "MQ"},
"nodes": [
{
"id": "gid://gitlab/CommitPresenter/0334c32c55457cf7269db25c812284cfd4afe24f",
"shortId": "0334c32c",
"sha": "0334c32c55457cf7269db25c812284cfd4afe24f",
"title": "chore: #497 Merge code from main.",
"description": "",
"author": {"name": "name1 in page 1", "avatarUrl": "/uploads/-/system/user/avatar/29758/avatar.png"}
},
{
"id": "gid://gitlab/CommitPresenter/1494c07a894a8f38e53b2fe9f683f09efff955db",
"shortId": "1494c07a",
"sha": "1494c07a894a8f38e53b2fe9f683f09efff955db",
"title": "refactor: #497 Remove no needs code and rename",
"description": "",
"author": {"name": "name2 in page 1", "avatarUrl": "/uploads/-/system/user/avatar/29758/avatar.png"}
}
]
}
}
}
}
};
......@@ -9,7 +9,7 @@ import 'package:jihu_gitlab_app/core/widgets/loading_button.dart';
import 'package:jihu_gitlab_app/generated/l10n.dart';
import 'package:jihu_gitlab_app/l10n/current_locale.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/mr/models/mr_graphql_request_body.dart';
import 'package:jihu_gitlab_app/modules/mr/models/merge_request.dart';
import 'package:jihu_gitlab_app/routers.dart';
import 'package:mockito/mockito.dart';
......@@ -59,6 +59,7 @@ void main() {
.thenAnswer((_) => Future(() => r.Response.of<Map<String, dynamic>>(map)));
when(client.post('/api/graphql', getPaidMergeRequestDetailsGraphQLRequestBody('ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 17)))
.thenAnswer((_) => Future(() => r.Response.of<Map<String, dynamic>>(paidMrGraphQLDraftResponse)));
when(client.post("/api/graphql", queryCommitsGraphQLRequestBody("ultimate-plan/jihu-gitlab-app/jihu-gitlab-app", 17, ''))).thenAnswer((_) => Future(() => r.Response.of(commitsGraphQLResponse)));
var parameters = {'projectId': 72936, 'projectName': "demo", 'mergeRequestIid': 17, 'fullPath': 'ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 'test': true};
await tester.pumpWidget(MultiProvider(
providers: [
......
......@@ -10,7 +10,7 @@ import 'package:jihu_gitlab_app/core/widgets/photo_picker.dart';
import 'package:jihu_gitlab_app/modules/community/models/community_gq_request_body.dart';
import 'package:jihu_gitlab_app/modules/modules.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/mr/models/mr_graphql_request_body.dart';
import 'package:mockito/mockito.dart';
import '../../../test_data/discussion.dart';
......@@ -95,6 +95,7 @@ void onToDoRequestMock() {
.thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(mrGraphQLDraftResponse)));
when(client.post('/api/graphql', getPaidMergeRequestDetailsGraphQLRequestBody('ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 84)))
.thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(paidMrGraphQLDraftResponse)));
when(client.post("/api/graphql", queryCommitsGraphQLRequestBody("ultimate-plan/jihu-gitlab-app/jihu-gitlab-app", 84, ''))).thenAnswer((_) => Future(() => Response.of(commitsGraphQLResponse)));
when(client.get<List<Map<String, dynamic>>>("/api/v4/projects/59893/merge_requests/84/diffs?page=1&per_page=20")).thenAnswer((_) => Future(() => Response.of<List<Map<String, dynamic>>>([])));
when(client.post('/api/graphql', {
"variables": {"fullPath": 'ultimate-plan/jihu-gitlab-app/jihu-gitlab-app'},
......
......@@ -8,7 +8,7 @@ import 'package:jihu_gitlab_app/l10n/jihu_localizations.dart';
import 'package:jihu_gitlab_app/modules/modules.dart';
import 'package:jihu_gitlab_app/modules/mr/approval_view.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/mr/models/mr_graphql_request_body.dart';
import 'package:mockito/mockito.dart';
import '../../../finder/svg_finder.dart';
......@@ -24,6 +24,8 @@ Future<void> mergeRequestTest(WidgetTester tester, String targetString, bool isD
.thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(isDraft ? mrGraphQLDraftResponse : mrGraphQLResponse)));
when(client.post('/api/graphql', getPaidMergeRequestDetailsGraphQLRequestBody('ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 84)))
.thenAnswer((_) => Future(() => Response.of<Map<String, dynamic>>(isDraft ? paidMrGraphQLDraftResponse : paidMrGraphQLResponse)));
when(client.post("/api/graphql", queryCommitsGraphQLRequestBody("ultimate-plan/jihu-gitlab-app/jihu-gitlab-app", 84, ''))).thenAnswer((_) => Future(() => Response.of(commitsGraphQLResponse)));
await tester.tap(find.text(targetString));
for (int i = 0; i < 5; i++) {
await tester.pump(const Duration(seconds: 1));
......
......@@ -11,7 +11,7 @@ import 'package:jihu_gitlab_app/l10n/current_locale.dart';
import 'package:jihu_gitlab_app/l10n/jihu_localizations.dart';
import 'package:jihu_gitlab_app/modules/mr/approval_rule_view.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/mr/models/mr_graphql_request_body.dart';
import 'package:jihu_gitlab_app/routers.dart';
import 'package:mockito/mockito.dart';
import 'package:provider/provider.dart';
......@@ -41,6 +41,7 @@ void main() {
.thenAnswer((_) => Future(() => r.Response.of<Map<String, dynamic>>(mrGraphQLApprovedResponse)));
when(client.post('/api/graphql', getPaidMergeRequestDetailsGraphQLRequestBody('ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 17)))
.thenAnswer((_) => Future(() => r.Response.of<Map<String, dynamic>>(paidMrGraphQLResponse)));
when(client.post("/api/graphql", queryCommitsGraphQLRequestBody("ultimate-plan/jihu-gitlab-app/jihu-gitlab-app", 17, ''))).thenAnswer((_) => Future(() => r.Response.of(commitsGraphQLResponse)));
when(client.get<List<Map<String, dynamic>>>("/api/v4/projects/72936/merge_requests/17/diffs?page=1&per_page=20")).thenAnswer((_) => Future(() => r.Response.of<List<Map<String, dynamic>>>([])));
var parameters = {'projectId': 72936, 'projectName': "demo", 'mergeRequestIid': 17, 'fullPath': 'ultimate-plan/jihu-gitlab-app/jihu-gitlab-app', 'test': true};
await tester.pumpWidget(MultiProvider(
......@@ -761,3 +762,33 @@ Map<String, dynamic> approvalResponse = {
"multiple_approval_rules_available": true,
"invalid_approvers_rules": []
};
Map<String, dynamic> commitsGraphQLResponse = {
"data": {
"project": {
"mergeRequest": {
"commits": {
"pageInfo": {"hasNextPage": false, "endCursor": "MQ"},
"nodes": [
{
"id": "gid://gitlab/CommitPresenter/0334c32c55457cf7269db25c812284cfd4afe24f",
"shortId": "0334c32c",
"sha": "0334c32c55457cf7269db25c812284cfd4afe24f",
"title": "chore: #497 Merge code from main.",
"description": "",
"author": {"name": "name1 in page 1", "avatarUrl": "/uploads/-/system/user/avatar/29758/avatar.png"}
},
{
"id": "gid://gitlab/CommitPresenter/1494c07a894a8f38e53b2fe9f683f09efff955db",
"shortId": "1494c07a",
"sha": "1494c07a894a8f38e53b2fe9f683f09efff955db",
"title": "refactor: #497 Remove no needs code and rename",
"description": "",
"author": {"name": "name2 in page 1", "avatarUrl": "/uploads/-/system/user/avatar/29758/avatar.png"}
}
]
}
}
}
}
};
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册