import 'package:flutter_test/flutter_test.dart'; import 'package:tm_app/data/services/model/lot/lot.dart'; import 'package:tm_app/data/services/model/organization/organization.dart'; import 'package:tm_app/data/services/model/organization/organization_address.dart'; import 'package:tm_app/data/services/model/tender_data/tender_data.dart'; void main() { group('Lot', () { test('fromJson maps lot_id/title/description', () { final lot = Lot.fromJson(const { 'lot_id': 'LOT-1', 'title': 'Lot title', 'description': 'Lot description', }); expect(lot.lotId, 'LOT-1'); expect(lot.title, 'Lot title'); expect(lot.description, 'Lot description'); }); test('toJson round-trips back to the same values', () { const lot = Lot(lotId: 'LOT-2', title: 'T', description: 'D'); expect(Lot.fromJson(lot.toJson()), lot); }); test('missing fields parse as null (resilient to partial payloads)', () { final lot = Lot.fromJson(const {}); expect(lot.lotId, isNull); expect(lot.title, isNull); expect(lot.description, isNull); }); }); group('OrganizationAddress', () { test('fromJson maps city_name/country_code', () { final address = OrganizationAddress.fromJson(const { 'city_name': 'Amsterdam', 'country_code': 'NL', }); expect(address.cityName, 'Amsterdam'); expect(address.countryCode, 'NL'); }); test('toJson round-trips back to the same values', () { const address = OrganizationAddress( cityName: 'Berlin', countryCode: 'DE', ); expect(OrganizationAddress.fromJson(address.toJson()), address); }); test('nested under Organization.fromJson', () { final org = Organization.fromJson(const { 'name': 'Buyer Org', 'company_id': 'COMP-1', 'address': {'city_name': 'Paris', 'country_code': 'FR'}, }); expect(org.name, 'Buyer Org'); expect(org.companyId, 'COMP-1'); expect(org.address?.cityName, 'Paris'); expect(org.address?.countryCode, 'FR'); }); }); group('TenderData new fields', () { Map baseJson({ Object? issueDate, Object? issueTime, }) => { 'success': true, 'message': 'ok', 'id': 'TND-1', 'tender_id': 'TND-1', 'notice_publication_id': 'NP-1', 'notice_type_code': 'NT-1', 'form_type': 'open', 'notice_language_code': 'en', 'issue_date': issueDate, 'issue_time': issueTime, 'publication_date': 1700000000, 'title': 'Title', 'description': 'Desc', 'procurement_type_code': 'PT-1', 'procedure_code': 'PRC-1', 'estimated_value': 1000, 'currency': 'EUR', 'duration': '12', 'tender_deadline': 1710000000, 'submission_deadline': 1710000000, 'application_deadline': 1710000000, 'submission_url': 'https://example.com', 'country_code': 'NL', 'duration_unit': 'month', 'buyer_organization': { 'name': 'Buyer Org', 'company_id': 'COMP-1', 'address': {'city_name': 'Amsterdam', 'country_code': 'NL'}, }, 'lots': [ {'lot_id': 'LOT-1', 'title': 'Lot title', 'description': 'Lot desc'}, ], 'official_languages': ['en', 'nl'], 'status': 'active', }; test('parses notice/form/language, lots and official_languages', () { final tender = TenderData.fromJson(baseJson( issueDate: 1700000000, issueTime: 1700003600, )); expect(tender.noticeTypeCode, 'NT-1'); expect(tender.formType, 'open'); expect(tender.noticeLanguageCode, 'en'); expect(tender.officialLanguages, ['en', 'nl']); expect(tender.lots, hasLength(1)); expect(tender.lots?.first.lotId, 'LOT-1'); expect(tender.buyerOrganization?.address?.cityName, 'Amsterdam'); }); test('issue_date/issue_time accept epoch seconds', () { final tender = TenderData.fromJson(baseJson( issueDate: 1700000000, issueTime: 1700003600, )); expect(tender.issueDate, 1700000000); expect(tender.issueTime, 1700003600); }); test('issue_date/issue_time accept millisecond and string inputs', () { final tender = TenderData.fromJson(baseJson( issueDate: '1700000000', issueTime: 1700000000000, )); // unixTimestampFromJson normalizes the raw value; the >1e10 ms value is // kept as-is here (timeConvertor downscales it at display time). expect(tender.issueDate, 1700000000); expect(tender.issueTime, 1700000000000); }); test('non-positive or missing issue_date/issue_time become null', () { final tender = TenderData.fromJson(baseJson( issueDate: 0, issueTime: null, )); expect(tender.issueDate, isNull); expect(tender.issueTime, isNull); }); }); }