81 lines
2.6 KiB
Dart
81 lines
2.6 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:hepan_everyday/data/json_schedule_import.dart';
|
|
import 'package:hepan_everyday/domain/course.dart';
|
|
import 'package:hepan_everyday/domain/app_snapshot.dart';
|
|
import 'package:hepan_everyday/domain/school_term.dart';
|
|
|
|
import '../domain/schedule_engine_test.dart' show course;
|
|
|
|
Map<String, dynamic> row({String id = 'a', int day = 1}) => {
|
|
'id': id,
|
|
'name': '矩阵论',
|
|
'teacher': '老师',
|
|
'room': '教室',
|
|
'weekday': day,
|
|
'startPeriod': 1,
|
|
'endPeriod': 2,
|
|
'weeks': [1, 3, 5],
|
|
};
|
|
String input(List<dynamic> courses, {int version = 1, bool demo = false}) =>
|
|
jsonEncode({'schemaVersion': version, 'isDemo': demo, 'courses': courses});
|
|
void main() {
|
|
test('saved term metadata and legacy course IDs keep JSON imports in their actual term', () {
|
|
final saved = AppSnapshot(
|
|
schoolTerm: SchoolTerm(72),
|
|
courses: [course()],
|
|
).toJson();
|
|
expect(
|
|
JsonScheduleImport.parse(jsonEncode(saved)).schoolTerm,
|
|
SchoolTerm(72),
|
|
);
|
|
saved.remove('schoolTerm');
|
|
(saved['courses'] as List).first['id'] = 'uestc-71-101-1-1-2-example';
|
|
expect(
|
|
JsonScheduleImport.parse(jsonEncode(saved)).schoolTerm,
|
|
SchoolTerm(71),
|
|
);
|
|
saved['schoolTerm'] = {'id': 0};
|
|
expect(
|
|
() => JsonScheduleImport.parse(jsonEncode(saved)),
|
|
throwsFormatException,
|
|
);
|
|
});
|
|
test('file import normalizes weeks and cannot claim school provenance', () {
|
|
final parsed = JsonScheduleImport.parse(input([row()]));
|
|
expect(parsed.courses, hasLength(1));
|
|
expect(parsed.courses.single.weeks, {1, 3, 5});
|
|
expect(parsed.source, CourseSource.file);
|
|
});
|
|
test('one invalid course rejects the whole draft', () {
|
|
expect(
|
|
() => JsonScheduleImport.parse(input([row(), row(id: 'b', day: 8)])),
|
|
throwsFormatException,
|
|
);
|
|
});
|
|
test('duplicate identifiers and unsupported schema are rejected', () {
|
|
expect(
|
|
() => JsonScheduleImport.parse(input([row(), row()])),
|
|
throwsFormatException,
|
|
);
|
|
expect(
|
|
() => JsonScheduleImport.parse(input([], version: 2)),
|
|
throwsFormatException,
|
|
);
|
|
});
|
|
test('demo import is explicitly separated from real records', () {
|
|
expect(
|
|
JsonScheduleImport.parse(input([row()], demo: true)).source,
|
|
CourseSource.demo,
|
|
);
|
|
});
|
|
test('valid but oversized JSON is rejected before accepting a course', () {
|
|
final large = row()..['name'] = List.filled(2100000, 'x').join();
|
|
expect(
|
|
() => JsonScheduleImport.parse(input([large])),
|
|
throwsFormatException,
|
|
);
|
|
});
|
|
}
|