Skip to content

Commit 480b729

Browse files
authored
Merge pull request #58 from flutter-news-app-full-source-code/refactor/savedfilter-model-ordering-support
Refactor/savedfilter model ordering support
2 parents 4038a0c + d0902ed commit 480b729

File tree

8 files changed

+109
-131
lines changed

8 files changed

+109
-131
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# 1.2.1 - 2025-10-15
2+
3+
- fix(fixtures): populate `followedCountries` in user preferences fixture.
4+
- fix(test): align `user_content_preferences_test` with fixture data.
5+
- chore(fixtures): use dynamic image URLs for headline fixtures.
6+
- chore(test): refactor tests to use fixtures directly instead of manual setup.
7+
18
# 1.2.0 - 2025-10-12
29

310
- feat: add SavedFilter model for storing user-defined filter combinations.

lib/src/fixtures/fixtures.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ export 'headlines.dart';
55
export 'languages.dart';
66
export 'local_ads.dart';
77
export 'remote_configs.dart';
8-
export 'saved_filter.dart';
98
export 'sources.dart';
109
export 'topics.dart';
1110
export 'user_app_settings.dart';

lib/src/fixtures/headlines.dart

Lines changed: 50 additions & 50 deletions
Large diffs are not rendered by default.

lib/src/fixtures/saved_filter.dart

Lines changed: 0 additions & 30 deletions
This file was deleted.
Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,41 @@
11
import 'package:core/src/fixtures/fixture_ids.dart';
2+
import 'package:core/src/fixtures/headlines.dart';
3+
import 'package:core/src/fixtures/sources.dart';
4+
import 'package:core/src/fixtures/topics.dart';
25
import 'package:core/src/models/user_preferences/user_content_preferences.dart';
6+
import 'package:core/src/models/user_presets/saved_filter.dart';
37

48
/// User Content Preferences Demo Data
59
final List<UserContentPreferences> userContentPreferencesFixturesData = [
6-
const UserContentPreferences(
10+
UserContentPreferences(
711
id: kAdminUserId,
8-
followedCountries: [],
9-
followedSources: [],
10-
followedTopics: [],
11-
savedHeadlines: [],
12-
savedFilters: [],
12+
followedCountries: const [],
13+
followedSources: [
14+
sourcesFixturesData[0], // TechCrunch
15+
sourcesFixturesData[1], // BBC News
16+
],
17+
followedTopics: [
18+
topicsFixturesData[0], // Technology
19+
topicsFixturesData[1], // Sports
20+
topicsFixturesData[6], // Business
21+
topicsFixturesData[7], // Travel
22+
],
23+
savedHeadlines: [headlinesFixturesData[0], headlinesFixturesData[10]],
24+
savedFilters: [
25+
SavedFilter(
26+
id: kSavedFilterId1,
27+
name: 'Tech News',
28+
topics: [topicsFixturesData[0]], // Technology
29+
sources: [sourcesFixturesData[0]], // TechCrunch
30+
countries: const [],
31+
),
32+
SavedFilter(
33+
id: kSavedFilterId2,
34+
name: 'World Biz',
35+
topics: [topicsFixturesData[6]], // Business
36+
sources: const [],
37+
countries: const [],
38+
),
39+
],
1340
),
1441
];

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: core
22
description: Shared utilities and models.
33
publish_to: none
44
repository: https://github.com/flutter-news-app-full-source-code/core
5-
version: 1.2.0
5+
version: 1.2.1
66

77
environment:
88
sdk: ^3.9.0

test/src/models/user_preferences/user_content_preferences_test.dart

Lines changed: 17 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,32 @@ import 'package:test/test.dart';
33

44
void main() {
55
group('UserContentPreferences', () {
6-
// Get fixtures to build a populated test subject
7-
final mockCountry = countriesFixturesData.first;
8-
final mockSource = sourcesFixturesData.first;
9-
final mockTopic = topicsFixturesData.first;
10-
final mockHeadline = headlinesFixturesData.first;
11-
final mockSavedFilter = savedFiltersFixturesData.first;
12-
13-
// Use the base fixture and copyWith to create a populated version for tests
14-
final userContentPreferencesFixture = userContentPreferencesFixturesData
15-
.first
16-
.copyWith(
17-
followedCountries: [mockCountry],
18-
followedSources: [mockSource],
19-
followedTopics: [mockTopic],
20-
savedHeadlines: [],
21-
savedFilters: [mockSavedFilter],
22-
);
6+
// Use the first item from the fixtures as the test subject.
7+
// This ensures tests are based on the canonical fixture data.
8+
final userContentPreferencesFixture =
9+
userContentPreferencesFixturesData.first;
2310

2411
group('constructor', () {
2512
test('returns correct instance', () {
2613
expect(userContentPreferencesFixture, isA<UserContentPreferences>());
2714
});
2815

29-
test('returns correct instance with empty lists from fixture', () {
30-
// The base fixture should have empty lists
31-
final defaultPreferences = userContentPreferencesFixturesData.first;
32-
expect(defaultPreferences.followedCountries, isEmpty);
33-
expect(defaultPreferences.followedSources, isEmpty);
34-
expect(defaultPreferences.followedTopics, isEmpty);
35-
expect(defaultPreferences.savedHeadlines, isEmpty);
36-
expect(defaultPreferences.savedFilters, isEmpty);
16+
test('returns correct instance with populated lists from fixture', () {
17+
// The base fixture should now have populated lists
18+
final preferences = userContentPreferencesFixturesData.first;
19+
expect(preferences.followedCountries, isEmpty); // This list is empty
20+
expect(preferences.followedSources, isNotEmpty);
21+
expect(preferences.followedTopics, isNotEmpty);
22+
expect(preferences.savedHeadlines, isNotEmpty);
23+
expect(preferences.savedFilters, isNotEmpty);
3724
});
3825
});
3926

4027
group('fromJson/toJson', () {
4128
test('round trip with all fields populated', () {
42-
final preferencesWithSaved = userContentPreferencesFixture.copyWith(
43-
savedHeadlines: [mockHeadline],
44-
savedFilters: [mockSavedFilter],
45-
);
46-
final json = preferencesWithSaved.toJson();
29+
final json = userContentPreferencesFixture.toJson();
4730
final result = UserContentPreferences.fromJson(json);
48-
expect(result, equals(preferencesWithSaved));
31+
expect(result, equals(userContentPreferencesFixture));
4932
});
5033

5134
test('round trip with empty lists', () {
@@ -59,30 +42,22 @@ void main() {
5942
group('copyWith', () {
6043
test('returns a new instance with updated fields', () {
6144
final newCountry = countriesFixturesData[1];
62-
final newHeadline = headlinesFixturesData[1];
63-
final newSavedFilter = savedFiltersFixturesData[1];
6445

6546
final updatedPreferences = userContentPreferencesFixture.copyWith(
6647
followedCountries: [newCountry],
67-
savedFilters: [mockSavedFilter, newSavedFilter],
68-
savedHeadlines: [mockHeadline, newHeadline],
6948
);
7049

7150
expect(updatedPreferences.id, userContentPreferencesFixture.id);
7251
expect(updatedPreferences.followedCountries, [newCountry]);
52+
// Verify other fields remain unchanged
7353
expect(
7454
updatedPreferences.followedSources,
7555
userContentPreferencesFixture.followedSources,
7656
);
7757
expect(
78-
updatedPreferences.followedTopics,
79-
userContentPreferencesFixture.followedTopics,
58+
updatedPreferences.savedFilters,
59+
userContentPreferencesFixture.savedFilters,
8060
);
81-
expect(updatedPreferences.savedFilters, [
82-
mockSavedFilter,
83-
newSavedFilter,
84-
]);
85-
expect(updatedPreferences.savedHeadlines, [mockHeadline, newHeadline]);
8661
});
8762

8863
test(

test/src/models/user_presets/saved_filter_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:test/test.dart';
33

44
void main() {
55
group('SavedFilter', () {
6-
final mockSavedFilter = savedFiltersFixturesData.first;
6+
final mockSavedFilter = userContentPreferencesFixturesData.first.savedFilters.first;
77

88
group('constructor', () {
99
test('returns correct instance', () {

0 commit comments

Comments
 (0)