Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
# 1.2.1 - 2025-10-15

- fix(fixtures): populate `followedCountries` in user preferences fixture.
- fix(test): align `user_content_preferences_test` with fixture data.
- chore(fixtures): use dynamic image URLs for headline fixtures.
- chore(test): refactor tests to use fixtures directly instead of manual setup.

# 1.2.0 - 2025-10-12

- feat: add SavedFilter model for storing user-defined filter combinations.
Expand Down
1 change: 0 additions & 1 deletion lib/src/fixtures/fixtures.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ export 'headlines.dart';
export 'languages.dart';
export 'local_ads.dart';
export 'remote_configs.dart';
export 'saved_filter.dart';
export 'sources.dart';
export 'topics.dart';
export 'user_app_settings.dart';
Expand Down
100 changes: 50 additions & 50 deletions lib/src/fixtures/headlines.dart

Large diffs are not rendered by default.

30 changes: 0 additions & 30 deletions lib/src/fixtures/saved_filter.dart

This file was deleted.

39 changes: 33 additions & 6 deletions lib/src/fixtures/user_content_preferences.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,41 @@
import 'package:core/src/fixtures/fixture_ids.dart';
import 'package:core/src/fixtures/headlines.dart';
import 'package:core/src/fixtures/sources.dart';
import 'package:core/src/fixtures/topics.dart';
import 'package:core/src/models/user_preferences/user_content_preferences.dart';
import 'package:core/src/models/user_presets/saved_filter.dart';

/// User Content Preferences Demo Data
final List<UserContentPreferences> userContentPreferencesFixturesData = [
const UserContentPreferences(
UserContentPreferences(
id: kAdminUserId,
followedCountries: [],
followedSources: [],
followedTopics: [],
savedHeadlines: [],
savedFilters: [],
followedCountries: const [],
followedSources: [
sourcesFixturesData[0], // TechCrunch
sourcesFixturesData[1], // BBC News
],
followedTopics: [
topicsFixturesData[0], // Technology
topicsFixturesData[1], // Sports
topicsFixturesData[6], // Business
topicsFixturesData[7], // Travel
],
savedHeadlines: [headlinesFixturesData[0], headlinesFixturesData[10]],
savedFilters: [
SavedFilter(
id: kSavedFilterId1,
name: 'Tech News',
topics: [topicsFixturesData[0]], // Technology
sources: [sourcesFixturesData[0]], // TechCrunch
countries: const [],
),
SavedFilter(
id: kSavedFilterId2,
name: 'World Biz',
topics: [topicsFixturesData[6]], // Business
sources: const [],
countries: const [],
),
],
),
];
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: core
description: Shared utilities and models.
publish_to: none
repository: https://github.com/flutter-news-app-full-source-code/core
version: 1.2.0
version: 1.2.1

environment:
sdk: ^3.9.0
Expand Down
59 changes: 17 additions & 42 deletions test/src/models/user_preferences/user_content_preferences_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,32 @@ import 'package:test/test.dart';

void main() {
group('UserContentPreferences', () {
// Get fixtures to build a populated test subject
final mockCountry = countriesFixturesData.first;
final mockSource = sourcesFixturesData.first;
final mockTopic = topicsFixturesData.first;
final mockHeadline = headlinesFixturesData.first;
final mockSavedFilter = savedFiltersFixturesData.first;

// Use the base fixture and copyWith to create a populated version for tests
final userContentPreferencesFixture = userContentPreferencesFixturesData
.first
.copyWith(
followedCountries: [mockCountry],
followedSources: [mockSource],
followedTopics: [mockTopic],
savedHeadlines: [],
savedFilters: [mockSavedFilter],
);
// Use the first item from the fixtures as the test subject.
// This ensures tests are based on the canonical fixture data.
final userContentPreferencesFixture =
userContentPreferencesFixturesData.first;

group('constructor', () {
test('returns correct instance', () {
expect(userContentPreferencesFixture, isA<UserContentPreferences>());
});

test('returns correct instance with empty lists from fixture', () {
// The base fixture should have empty lists
final defaultPreferences = userContentPreferencesFixturesData.first;
expect(defaultPreferences.followedCountries, isEmpty);
expect(defaultPreferences.followedSources, isEmpty);
expect(defaultPreferences.followedTopics, isEmpty);
expect(defaultPreferences.savedHeadlines, isEmpty);
expect(defaultPreferences.savedFilters, isEmpty);
test('returns correct instance with populated lists from fixture', () {
// The base fixture should now have populated lists
final preferences = userContentPreferencesFixturesData.first;
expect(preferences.followedCountries, isEmpty); // This list is empty
expect(preferences.followedSources, isNotEmpty);
expect(preferences.followedTopics, isNotEmpty);
expect(preferences.savedHeadlines, isNotEmpty);
expect(preferences.savedFilters, isNotEmpty);
});
});

group('fromJson/toJson', () {
test('round trip with all fields populated', () {
final preferencesWithSaved = userContentPreferencesFixture.copyWith(
savedHeadlines: [mockHeadline],
savedFilters: [mockSavedFilter],
);
final json = preferencesWithSaved.toJson();
final json = userContentPreferencesFixture.toJson();
final result = UserContentPreferences.fromJson(json);
expect(result, equals(preferencesWithSaved));
expect(result, equals(userContentPreferencesFixture));
});

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

final updatedPreferences = userContentPreferencesFixture.copyWith(
followedCountries: [newCountry],
savedFilters: [mockSavedFilter, newSavedFilter],
savedHeadlines: [mockHeadline, newHeadline],
);

expect(updatedPreferences.id, userContentPreferencesFixture.id);
expect(updatedPreferences.followedCountries, [newCountry]);
// Verify other fields remain unchanged
expect(
updatedPreferences.followedSources,
userContentPreferencesFixture.followedSources,
);
expect(
updatedPreferences.followedTopics,
userContentPreferencesFixture.followedTopics,
updatedPreferences.savedFilters,
userContentPreferencesFixture.savedFilters,
);
expect(updatedPreferences.savedFilters, [
mockSavedFilter,
newSavedFilter,
]);
expect(updatedPreferences.savedHeadlines, [mockHeadline, newHeadline]);
});

test(
Expand Down
2 changes: 1 addition & 1 deletion test/src/models/user_presets/saved_filter_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:test/test.dart';

void main() {
group('SavedFilter', () {
final mockSavedFilter = savedFiltersFixturesData.first;
final mockSavedFilter = userContentPreferencesFixturesData.first.savedFilters.first;

group('constructor', () {
test('returns correct instance', () {
Expand Down
Loading