Implement tender workflows and dashboard integration
continuous-integration/drone/push Build encountered an error

This commit is contained in:
AmirReza Jamali
2026-07-14 11:12:09 +03:30
parent ce170f9bc8
commit 72881df210
29 changed files with 1820 additions and 159 deletions
+90
View File
@@ -0,0 +1,90 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:tm_app/data/services/model/tender_submission/tender_submission.dart';
void main() {
group('TenderSubmissionsResponse', () {
test('parses root pagination metadata and a reduced tender payload', () {
final response = TenderSubmissionsResponse.fromJson({
'success': true,
'message': 'Tender submissions retrieved successfully',
'data': [
{
'id': 'submission-1',
'tender_id': 'tender-1',
'company_id': 'company-1',
'customer_id': 'customer-1',
'status': 'validating',
'stage': 'in_progress',
'created_at': 1710000000,
'updated_at': 1710003600,
'status_history': [
{
'status': 'validating',
'changed_at': 1710003600,
'description': 'User accepted tender',
},
],
'tender': {
'id': 'tender-1',
'title': 'IT Infrastructure Services',
'description': 'A reduced tender payload',
'submission_deadline': 1714000000,
'country_code': 'DE',
'status': 'active',
},
},
],
'meta': {
'total': 42,
'limit': 20,
'offset': 0,
'page': 1,
'pages': 3,
'has_more': true,
},
});
expect(response.success, isTrue);
expect(response.data, hasLength(1));
expect(response.data.single.status, 'validating');
expect(response.data.single.stage, 'in_progress');
expect(response.data.single.tender?.title, 'IT Infrastructure Services');
expect(response.data.single.statusHistory.single.changedAt, 1710003600);
expect(response.meta?.total, 42);
expect(response.meta?.hasMore, isTrue);
});
test('keeps a submission when its tender is null', () {
final response = TenderSubmissionResponse.fromJson({
'success': true,
'data': {
'id': 'submission-2',
'tender_id': 'tender-2',
'status': 'not_applied',
'stage': 'not_applied',
'tender': null,
},
});
expect(response.data?.tender, isNull);
expect(response.data?.isTerminal, isTrue);
});
});
test('parses company stats maps', () {
final response = TenderSubmissionStatsResponse.fromJson({
'success': true,
'data': {
'company_id': 'company-1',
'total': 15,
'by_stage': {'opportunity': 3, 'in_progress': 5},
'by_status': {'validating': 2, 'contract': 2},
'last_updated': 1710003600,
},
});
expect(response.data?.total, 15);
expect(response.data?.byStage['in_progress'], 5);
expect(response.data?.byStatus['contract'], 2);
});
}
@@ -11,6 +11,7 @@ import 'package:tm_app/data/services/model/recommended_tenders_data/recommended_
import 'package:tm_app/data/services/model/recommended_tenders_response/recommended_tenders_response.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import 'package:tm_app/data/services/your_tenders_service.dart';
import 'package:tm_app/data/services/tender_submissions_service.dart';
import 'package:tm_app/view_models/ai_recommendations_view_model.dart';
void main() {
@@ -150,6 +151,9 @@ class _FakeHomeRepository extends HomeRepository {
likedTendersService: LikedTendersService(
networkManager: NetworkManager(prefs),
),
tenderSubmissionsService: TenderSubmissionsService(
networkManager: NetworkManager(prefs),
),
);
final List<Result<RecommendedTendersResponse>> _results;