import 'package:coves_flutter/models/community.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { // Note: Full widget tests for CommunityPickerScreen require mocking the API // service and proper timer management. The core business logic is thoroughly // tested in the unit test groups below (search filtering, count formatting, // description building). Widget integration tests would need a mock API service // to avoid real network calls and pending timer issues from the search debounce. group('CommunityPickerScreen Search Filtering', () { test('client-side filtering should match name', () { final communities = [ CommunityView(did: 'did:1', name: 'programming'), CommunityView(did: 'did:2', name: 'gaming'), CommunityView(did: 'did:3', name: 'music'), ]; final query = 'prog'; final filtered = communities.where((community) { final name = community.name.toLowerCase(); return name.contains(query.toLowerCase()); }).toList(); expect(filtered.length, 1); expect(filtered[0].name, 'programming'); }); test('client-side filtering should match displayName', () { final communities = [ CommunityView( did: 'did:1', name: 'prog', displayName: 'Programming Discussion', ), CommunityView(did: 'did:2', name: 'gaming', displayName: 'Gaming'), CommunityView(did: 'did:3', name: 'music', displayName: 'Music'), ]; final query = 'discussion'; final filtered = communities.where((community) { final name = community.name.toLowerCase(); final displayName = community.displayName?.toLowerCase() ?? ''; return name.contains(query.toLowerCase()) || displayName.contains(query.toLowerCase()); }).toList(); expect(filtered.length, 1); expect(filtered[0].displayName, 'Programming Discussion'); }); test('client-side filtering should match description', () { final communities = [ CommunityView( did: 'did:1', name: 'prog', description: 'A place to discuss coding and software', ), CommunityView( did: 'did:2', name: 'gaming', description: 'Gaming news and discussions', ), CommunityView( did: 'did:3', name: 'music', description: 'Music appreciation', ), ]; final query = 'software'; final filtered = communities.where((community) { final name = community.name.toLowerCase(); final description = community.description?.toLowerCase() ?? ''; return name.contains(query.toLowerCase()) || description.contains(query.toLowerCase()); }).toList(); expect(filtered.length, 1); expect(filtered[0].name, 'prog'); }); test('client-side filtering should be case insensitive', () { final communities = [ CommunityView(did: 'did:1', name: 'Programming'), CommunityView(did: 'did:2', name: 'GAMING'), CommunityView(did: 'did:3', name: 'music'), ]; final query = 'PROG'; final filtered = communities.where((community) { final name = community.name.toLowerCase(); return name.contains(query.toLowerCase()); }).toList(); expect(filtered.length, 1); expect(filtered[0].name, 'Programming'); }); test('empty query should return all communities', () { final communities = [ CommunityView(did: 'did:1', name: 'programming'), CommunityView(did: 'did:2', name: 'gaming'), CommunityView(did: 'did:3', name: 'music'), ]; final query = ''; List filtered; if (query.isEmpty) { filtered = communities; } else { filtered = communities.where((community) { final name = community.name.toLowerCase(); return name.contains(query.toLowerCase()); }).toList(); } expect(filtered.length, 3); }); test('no match should return empty list', () { final communities = [ CommunityView(did: 'did:1', name: 'programming'), CommunityView(did: 'did:2', name: 'gaming'), CommunityView(did: 'did:3', name: 'music'), ]; final query = 'xyz123'; final filtered = communities.where((community) { final name = community.name.toLowerCase(); final displayName = community.displayName?.toLowerCase() ?? ''; final description = community.description?.toLowerCase() ?? ''; return name.contains(query.toLowerCase()) || displayName.contains(query.toLowerCase()) || description.contains(query.toLowerCase()); }).toList(); expect(filtered.length, 0); }); }); group('CommunityPickerScreen Member Count Formatting', () { String formatCount(int? count) { if (count == null) { return '0'; } if (count >= 1000000) { return '${(count / 1000000).toStringAsFixed(1)}M'; } else if (count >= 1000) { return '${(count / 1000).toStringAsFixed(1)}K'; } return count.toString(); } test('should format null count as 0', () { expect(formatCount(null), '0'); }); test('should format small numbers as-is', () { expect(formatCount(0), '0'); expect(formatCount(1), '1'); expect(formatCount(100), '100'); expect(formatCount(999), '999'); }); test('should format thousands with K suffix', () { expect(formatCount(1000), '1.0K'); expect(formatCount(1500), '1.5K'); expect(formatCount(10000), '10.0K'); expect(formatCount(999999), '1000.0K'); }); test('should format millions with M suffix', () { expect(formatCount(1000000), '1.0M'); expect(formatCount(1500000), '1.5M'); expect(formatCount(10000000), '10.0M'); }); }); group('CommunityPickerScreen Description Building', () { test('should build description with member count only', () { const memberCount = 1000; const subscriberCount = 0; String formatCount(int count) { if (count >= 1000) { return '${(count / 1000).toStringAsFixed(1)}K'; } return count.toString(); } var descriptionLine = ''; if (memberCount > 0) { descriptionLine = '${formatCount(memberCount)} members'; } expect(descriptionLine, '1.0K members'); }); test('should build description with member and subscriber counts', () { const memberCount = 1000; const subscriberCount = 500; String formatCount(int count) { if (count >= 1000) { return '${(count / 1000).toStringAsFixed(1)}K'; } return count.toString(); } var descriptionLine = ''; if (memberCount > 0) { descriptionLine = '${formatCount(memberCount)} members'; if (subscriberCount > 0) { descriptionLine += ' · ${formatCount(subscriberCount)} subscribers'; } } expect(descriptionLine, '1.0K members · 500 subscribers'); }); test('should build description with subscriber count only', () { const memberCount = 0; const subscriberCount = 500; String formatCount(int count) { if (count >= 1000) { return '${(count / 1000).toStringAsFixed(1)}K'; } return count.toString(); } var descriptionLine = ''; if (memberCount > 0) { descriptionLine = '${formatCount(memberCount)} members'; } else if (subscriberCount > 0) { descriptionLine = '${formatCount(subscriberCount)} subscribers'; } expect(descriptionLine, '500 subscribers'); }); test('should append community description with separator', () { const memberCount = 100; const description = 'A great community'; String formatCount(int count) => count.toString(); var descriptionLine = ''; if (memberCount > 0) { descriptionLine = '${formatCount(memberCount)} members'; } if (description.isNotEmpty) { if (descriptionLine.isNotEmpty) { descriptionLine += ' · '; } descriptionLine += description; } expect(descriptionLine, '100 members · A great community'); }); }); }