Testing Guide

Comprehensive unit and state tests for models, services, and state management.

Running Tests

# Run all tests flutter test # Run with verbose output flutter test --reporter expanded # Run specific test file flutter test test/models/event_model_test.dart # Run with coverage flutter test --coverage lcov -r coverage/lcov.info 'lib/views/*' -o coverage/filtered.info genhtml coverage/filtered.info -o coverage/html

Test Structure

test/
โ”œโ”€โ”€ core/
โ”‚   โ”œโ”€โ”€ event_service_test.dart        # EventService coordination tests
โ”‚   โ””โ”€โ”€ http_utils_test.dart           # SSRF protection, scheme validation
โ”œโ”€โ”€ models/
โ”‚   โ”œโ”€โ”€ event_model_test.dart          # Serialization, equality, copyWith
โ”‚   โ”œโ”€โ”€ event_model_tags_test.dart     # Tag handling in fromJson/toJson
โ”‚   โ”œโ”€โ”€ event_model_recurrence_test.dart  # Recurrence generation
โ”‚   โ”œโ”€โ”€ event_tag_test.dart            # Tag equality, preset validation
โ”‚   โ”œโ”€โ”€ recurrence_rule_test.dart      # Frequency, intervals, month clamping
โ”‚   โ””โ”€โ”€ user_model_test.dart           # User serialization
โ””โ”€โ”€ state/
    โ”œโ”€โ”€ event_bloc_test.dart           # BLoC state transitions
    โ”œโ”€โ”€ event_provider_test.dart       # O(1) index, CRUD operations
    โ””โ”€โ”€ user_provider_test.dart        # User session management
      

Test Categories

Model Tests

Verify serialization round-trips, value equality, and domain logic:

// Example: RecurrenceRule month clamping test test('monthly recurrence clamps day to valid range', () { final rule = RecurrenceRule( frequency: RecurrenceFrequency.monthly, ); final start = DateTime(2026, 1, 31); // Jan 31 final dates = rule.generateOccurrences(start, maxOccurrences: 3); expect(dates[1].day, 28); // Feb 28 (not 31!) expect(dates[2].day, 31); // Mar 31 });

Service Tests

Verify coordination between state and persistence:

State Tests

Verify reactive state management behavior:

Coverage

Coverage is tracked via Codecov and runs automatically in CI.

Coverage Strategy The project focuses coverage on models, services, and state โ€” the testable business logic. View tests (widget tests) are encouraged but not mandated, as they require more infrastructure and are harder to maintain.

Writing New Tests

Conventions

Example Pattern

import 'package:flutter_test/flutter_test.dart'; import 'package:everything/models/event_model.dart'; void main() { group('EventModel', () { test('round-trips through JSON', () { final original = EventModel( id: '1', title: 'Test', date: DateTime(2026, 1, 15), ); final json = original.toJson(); final restored = EventModel.fromJson(json); expect(restored, equals(original)); }); }); }