import 'package:flutter_test/flutter_test.dart'; import 'package:hepan_everyday/features/school/school_login_flow.dart'; void main() { test( 'exam redirect compares selected xq rather than only the shared path', () { final flow = SchoolLoginFlow(); final target = Uri.parse( 'https://yjsjy.uestc.edu.cn/pyxx/pygl/kskcxx/index?xq=72', ); flow.begin(target); expect( flow.onLoaded( target.replace(query: 'xq=72&view=student'), authenticated: true, ), isNull, ); expect( flow.onLoaded(target.replace(query: 'xq=73'), authenticated: true), target, ); flow.begin(target); expect( flow.onLoaded(target.replace(query: ''), authenticated: true), target, ); }, ); test( 'repeated school login bounces have a bounded automatic redirect budget', () { final flow = SchoolLoginFlow(); final target = Uri.parse( 'https://yjsjy.uestc.edu.cn/pyxx/pygl/xskbcx/index/1', ); final login = Uri.parse('https://idas.uestc.edu.cn/authserver/login'); final home = Uri.parse('https://yjsjy.uestc.edu.cn/pyxx/home/index'); flow.begin(target); for (var i = 0; i < 2; i++) { flow.onLoaded(login, authenticated: false); expect(flow.onLoaded(home, authenticated: true), target); } flow.onLoaded(login, authenticated: false); expect(flow.onLoaded(home, authenticated: true), isNull); flow.begin(target); expect(flow.onLoaded(home, authenticated: true), target); }, ); test('wait for student authentication then request timetable once', () { final flow = SchoolLoginFlow(); final target = Uri.parse( 'https://yjsjy.uestc.edu.cn/pyxx/pygl/xskbcx/index/1', ); flow.begin(target); expect( flow.onLoaded( Uri.parse( 'https://idas.uestc.edu.cn/authserver/login?service=graduate', ), authenticated: false, ), isNull, ); expect( flow.onLoaded( Uri.parse('http://yjsjy.uestc.edu.cn/pyxx/jzsso/login?ticket=ST-test'), authenticated: false, ), isNull, ); expect( flow.onLoaded( Uri.parse('http://yjsjy.uestc.edu.cn/pyxx/home/index'), authenticated: true, ), target, ); expect( flow.onLoaded( Uri.parse('https://yjsjy.uestc.edu.cn/pyxx/home/index'), authenticated: true, ), isNull, ); expect(flow.onLoaded(target, authenticated: true), isNull); flow.reset(); expect( flow.onLoaded( Uri.parse('https://yjsjy.uestc.edu.cn/pyxx/home/index'), authenticated: true, ), isNull, ); }); test( 'reauthentication and untrusted redirects cannot jump into timetable', () { final flow = SchoolLoginFlow(); final target = Uri.parse( 'https://yjsjy.uestc.edu.cn/pyxx/pygl/xskbcx/index/1', ); flow.begin(target); expect( flow.onLoaded( Uri.parse('https://evil.test/pyxx/home/index'), authenticated: true, ), isNull, ); expect( flow.onLoaded( Uri.parse('https://yjsjy.uestc.edu.cn/pyxx/home/index'), authenticated: false, ), isNull, ); expect( flow.onLoaded( Uri.parse('https://yjsjy.uestc.edu.cn/pyxx/home/index'), authenticated: true, ), target, ); flow.onLoaded( Uri.parse('https://idas.uestc.edu.cn/authserver/login'), authenticated: false, ); expect( flow.onLoaded( Uri.parse('https://yjsjy.uestc.edu.cn/pyxx/home/index'), authenticated: true, ), target, ); }, ); }